借鉴的是点击这里这篇,我自己引入之后有些报错和问题,修改了一下。
npm install html-docx-js
npm install file-saver
<!-- 包容要转为word的html盒子 --> <div class="export-box"> <!-- 插入html的内容 --> </div> <button @click="gohtml"></button> <script setup lang="ts"> import htmlDocx from 'html-docx-js/dist/html-docx'; import saveAs from 'file-saver'; // html转为word const gohtml = () => { //.export-box 需要转word的最大dom盒子的类名 const app = document.querySelector('.export-box'); const cloneApp = app.cloneNode(true); const canvases = app.getElementsByTagName('canvas'); const cloneCanvases = cloneApp.getElementsByTagName('canvas'); const promises = Array.from(canvases).map((ca, index) => { return new Promise((res) => { const url = ca.toDataURL('image/png', 1); const img = new Image(); img.onload = () => { URL.revokeObjectURL(url); res(); }; img.src = url; // 生成img插入clone的dom的canvas之前 cloneCanvases[index].parentNode.insertBefore( img, cloneCanvases[index], ); }); }); // 移除原来的canvas const cloneCanvas = cloneApp.getElementsByTagName('canvas'); Array.from(cloneCanvas).forEach((ca) => ca.parentNode.removeChild(ca)); Promise.all(promises).then(() => { convertImagesToBase64(cloneApp); console.log(document.head.outerHTML); const converted = htmlDocx.asBlob(` <html xmlns:o=\'urn:schemas-microsoft-com:office:office\' xmlns:w=\'urn:schemas-microsoft-com:office:word\' xmlns=\'http://www.w3.org/TR/REC-html40\'><head><style> ${document.head.outerHTML} </head> <body> ${cloneApp.outerHTML} </body> </html>`); saveAs(converted, 'test.docx'); }); }; const convertImagesToBase64 = (cloneApp) => { let regularImages = cloneApp.getElementsByTagName('img'); let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); for (let index = 0; index < regularImages.length; index++) { canvas.width = regularImages[index].width; canvas.height = regularImages[index].height; ctx.drawImage( regularImages[index], 0, 0, regularImages[index].width, regularImages[index].height, ); let ext = regularImages[index].src .substring(regularImages[index].src.lastIndexOf('.') + 1) .toLowerCase(); let dataURL = canvas.toDataURL('image/' + ext); regularImages[index].setAttribute('src', dataURL); } canvas.remove(); }; </script>
复制
import htmlDocx from 'html-docx-js/dist/html-docx';
一开始引入html-docx-js时,会报node_modules里一个with(obj)的错,把with()语句和花括号删除掉,再把里面的变量加上obj. 就可以了。如下
with(obj){ __p += '------=mhtDocumentPart\nContent-Type: ' + ((__t = ( contentType )) == null ? '' : __t) + '\nContent-Transfer-Encoding: ' + ((__t = ( contentEncoding )) == null ? '' : __t) + '\nContent-Location: ' + ((__t = ( contentLocation )) == null ? '' : __t) + '\n\n' + ((__t = (encodedContent )) == null ? '' : __t) + '\n'; } //改为 __p += '------=mhtDocumentPart\nContent-Type: ' + ((__t = ( obj.contentType )) == null ? '' : __t) + '\nContent-Transfer-Encoding: ' + ((__t = ( obj.contentEncoding )) == null ? '' : __t) + '\nContent-Location: ' + ((__t = ( obj.contentLocation )) == null ? '' : __t) + '\n\n' + ((__t = ( obj.encodedContent )) == null ? '' : __t) + '\n';
复制
.export-box div里 也可以放echarts图表