getWord2.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import Docxtemplater from 'docxtemplater'
  2. import PizZip from 'pizzip'
  3. import { getNowDate } from './Date';
  4. import { GetTime } from './Date';
  5. import FileSaver, { saveAs } from 'file-saver';
  6. import JSZipUtils from 'jszip-utils'
  7. import html2canvas from 'html2canvas'
  8. import ImageModule from 'docxtemplater-image-module-free'
  9. // 新学生创业项目申请表下载模板word版
  10. function getWord2(val){
  11. return new Promise((resolve,reject)=>{
  12. JSZipUtils.getBinaryContent('./file/2024年校级学生创新创业训练计划项目申报书模版2 - 图片 copy.docx',async (err,content)=>{
  13. if (err) {
  14. return console.log(err);
  15. }
  16. val.studentS.forEach((item)=>{
  17. for(let i in item){
  18. item[i] = item[i].split("\n")
  19. }
  20. })
  21. val.teacherS.forEach((item)=>{
  22. for(let i in item){
  23. item[i] = item[i].split("\n")
  24. }
  25. })
  26. let ImageList = await getImage(val.elementList);
  27. let zip=new PizZip(content);
  28. // 图片处理
  29. const opts = {
  30. centered:false,
  31. fileType:"docx",
  32. getImage:(value,value2,value3)=>{
  33. return base64DataURLToArrayBuffer(value)
  34. },
  35. getSize:(arrayValue,value,tagName)=>{
  36. let imgObj = ImageList.find(i=>i.tagName==tagName)
  37. let newWidth = 550;
  38. let newHeight = (newWidth*imgObj.height)/imgObj.width;
  39. return [newWidth,newHeight]
  40. }
  41. }
  42. let doc=new Docxtemplater()
  43. doc.loadZip(zip);
  44. doc.attachModule(new ImageModule(opts));
  45. //填写数据
  46. doc.setData({
  47. nowTime:getNowDate(1),//申请日期
  48. projectName:val.projectName,
  49. itp:val.radio=='4a4e2cfe-e1a1-11ee-81d4-00ff5c7a43f5'?'☑':'□',
  50. etp:val.radio=='56f0ad8d-e1a1-11ee-81d4-00ff5c7a43f5'?'☑':'□',
  51. ing:val.radio=='ed917c55-f51d-11ed-a3f6-509a4c5b67cf'?'☑':'□',
  52. mone:val.checkList.includes('1')?'☑':'□',
  53. mtwo:val.checkList.includes('2')?'☑':'□',
  54. mthree:val.checkList.includes('3')?'☑':'□',
  55. mfour:val.checkList.includes('4')?'☑':'□',
  56. mfive:val.checkList.includes('5')?'☑':'□',
  57. msix:val.checkList.includes('6')?'☑':'□',
  58. mseven:val.checkList.includes('7')?'☑':'□',
  59. sone:val.schoolRadio.includes('1')?'☑':'□',
  60. stwo:val.schoolRadio.includes('2')?'☑':'□',
  61. sthree:val.schoolRadio.includes('3')?'☑':'□',
  62. sfour:val.schoolRadio.includes('4')?'☑':'□',
  63. appPeason:val.applyParsonName,
  64. school:val.dp,
  65. tel:val.tel,
  66. begin_at:val.btime.split(' ')[0],
  67. plannedEnd_at:val.etime.split(' ')[0],
  68. allnum:val.studentS.filter(i=>i.name!='').length+val.teacherS.filter(i=>i.name!='').length,
  69. snum:val.studentS.filter(i=>i.name!='').length,
  70. tnum:val.teacherS.filter(i=>i.name!='').length,
  71. student:val.studentS,
  72. teacher:val.teacherS,
  73. brief:val.brief,
  74. back:ImageList.find(i=>i.tagName=='back').url,
  75. innovate:ImageList.find(i=>i.tagName=='innovate').url,
  76. path:ImageList.find(i=>i.tagName=='path').url,
  77. scene:ImageList.find(i=>i.tagName=='scene').url,
  78. worth:ImageList.find(i=>i.tagName=='worth').url,
  79. team:ImageList.find(i=>i.tagName=='team').url,
  80. cost:ImageList.find(i=>i.tagName=='cost').url,
  81. expectResults:ImageList.find(i=>i.tagName=='expectResults').url,
  82. expectResultsTeacher:ImageList.find(i=>i.tagName=='expectResultsTeacher').url,
  83. expectConversion:ImageList.find(i=>i.tagName=='expectConversion').url,
  84. plan:ImageList.find(i=>i.tagName=='plan').url,
  85. total:0,
  86. facility:0,
  87. materials:0,
  88. process:0,
  89. assist:0,
  90. authenticate:0,
  91. match:0,
  92. activity:0,
  93. affair:0,
  94. total:val.fund.device*1 + val.fund.Material*1+val.fund.processing*1+ val.fund.Collaboration*1+val.fund.APPRAISAL*1+ val.fund.entery*1+val.fund.activities*1+val.fund.Transaction*1,
  95. facility:val.fund.device,
  96. materials:val.fund.Material,
  97. process:val.fund.processing,
  98. assist:val.fund.Collaboration,
  99. authenticate:val.fund.APPRAISAL,
  100. match:val.fund.entery,
  101. activity:val.fund.activities,
  102. affair:val.fund.Transaction,
  103. signOne:val.signData.filter(i=>i.type==4)[0]?val.signData.filter(i=>i.type==4)[0].text:'',
  104. signOnePerson:val.signData.filter(i=>i.type==4)[0]?val.signData.filter(i=>i.type==4)[0].username:'',
  105. signOneTime:val.signData.filter(i=>i.type==4)[0]?val.signData.filter(i=>i.type==4)[0].time:'',
  106. signTwo:val.signData.filter(i=>i.type==0)[0]?val.signData.filter(i=>i.type==0)[0].text:'',
  107. signTwoPerson:val.signData.filter(i=>i.type==0)[0]?val.signData.filter(i=>i.type==0)[0].username:'',
  108. signTwoTime:val.signData.filter(i=>i.type==0)[0]?val.signData.filter(i=>i.type==0)[0].time:'',
  109. signThree:val.signData.filter(i=>i.type==3)[0]?val.signData.filter(i=>i.type==3)[0].text:'',
  110. signThreePerson:val.signData.filter(i=>i.type==3)[0]?val.signData.filter(i=>i.type==3)[0].username:'',
  111. signThreeTime:val.signData.filter(i=>i.type==3)[0]?val.signData.filter(i=>i.type==3)[0].time:'',
  112. })
  113. // 进行填充
  114. doc.render()
  115. let out=doc.getZip().generate({
  116. type:'blob',
  117. mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  118. })
  119. // fs.writeFileSync(path.resolve(__dirname, "output.docx"), buf);
  120. saveAs(out,'2024年校级学生创新创业训练计划项目申报书.docx')
  121. resolve()
  122. })
  123. })
  124. }
  125. function getImage(elList){
  126. return new Promise(async (resolve)=>{
  127. let imgList=[]
  128. let promiseList = [];
  129. elList.forEach(i=>{
  130. promiseList.push(new Promise(async (resolve)=>{
  131. let imgObj = {tagName:"",url:"",width:0,height:0}
  132. imgObj.tagName=i.getAttribute("tag");
  133. let canvas = await html2canvas(i,{
  134. allowTaint:true,
  135. useCORS:true,
  136. scale:1.5
  137. })
  138. imgObj.url = canvas.toDataURL('image/png');
  139. imgObj.width = canvas.width;
  140. imgObj.height = canvas.height;
  141. imgList.push(imgObj)
  142. resolve();
  143. }))
  144. })
  145. await Promise.all(promiseList).then(_=>resolve(imgList));
  146. })
  147. }
  148. //
  149. function base64DataURLToArrayBuffer(dataURL) {
  150. const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/;
  151. if (!base64Regex.test(dataURL)) {
  152. return false;
  153. }
  154. const stringBase64 = dataURL.replace(base64Regex, "");
  155. let binaryString;
  156. if (typeof window !== "undefined") {
  157. binaryString = window.atob(stringBase64);
  158. } else {
  159. binaryString = new Buffer(stringBase64, "base64").toString("binary");
  160. }
  161. const len = binaryString.length;
  162. const bytes = new Uint8Array(len);
  163. for (let i = 0; i < len; i++) {
  164. const ascii = binaryString.charCodeAt(i);
  165. bytes[i] = ascii;
  166. }
  167. return bytes.buffer;
  168. }
  169. export{
  170. getWord2,
  171. }