文档中{普通文字}{%图片}{%%居中图片}
<template> <el-date-picker v-model="value" class="timePicker" type="day" placeholder="" format="YYYY-MM-DD " value-format="YYYY-MM-DD"> </el-date-picker> <el-button type="primary" size="mini" @click="Export()">导出word</el-button> </template> <script> import exportWord from '@/utils/export-word' export default { name: "Chartgeneration", mixins:[exportWord], data() { }, data: function() { return { value: '' } }, methods:{ Export:function () { const data = { monitoringLine:'长白线', measuringpointKilometerPost:'K268+260', measuringpointName:'43#基站', cableModel:'SPTYWPL23', cableLength:'3.5km', start: '2022', JSON: 'json', ex: 'docx.js, docx4j, python-docx' } this.exportWord(data) } } } </script>
export-word.js
import docxtemplater from 'docxtemplater' import PizZip from 'pizzip' import JSZipUtils from 'jszip-utils' import { saveAs } from 'file-saver' import * as echarts from 'echarts'; import ImageModule from 'docxtemplater-image-module-free' export default { methods: { // 导出echarts图片,格式转换 base64DataURLToArrayBuffer(dataURL) { const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/; if (!base64Regex.test(dataURL)) { return false; } const stringBase64 = dataURL.replace(base64Regex, ""); let binaryString; if (typeof window !== "undefined") { binaryString = window.atob(stringBase64); } else { binaryString = new Buffer(stringBase64, "base64").toString("binary"); } const len = binaryString.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { const ascii = binaryString.charCodeAt(i); bytes[i] = ascii; } return bytes.buffer; }, //echarts exportWord( data, docTitle = '题目' ) { const div = document.createElement('div'); div.setAttribute('style', 'width: 560px;height:280px;') const myChart = echarts.init(div) myChart.setOption({ title: { text: '示例' }, tooltip: {}, legend: { data: ['销量'] }, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }) let _this=this setTimeout(() => { // 加setTimeout是为了让echarts渲染完成后生成图片 JSZipUtils.getBinaryContent('/auditResult.docx', function (error, content) { // 抛出异常 if (error) { throw error } const opts = { centered: false, fileType: 'docx' } opts.getImage = function (tagValue) { if (tagValue.size && tagValue.data) { return _this.base64DataURLToArrayBuffer(tagValue.data); } return _this.base64DataURLToArrayBuffer(tagValue); }; opts.getSize = function (_, tagValue) { if (tagValue.size && tagValue.data) { return tagValue.size; } return [560, 280]; }; // 创建一个JSZip实例,内容为模板的内容 const zip = new PizZip(content) // 创建并加载docxtemplater实例对象 const doc = new docxtemplater().loadZip(zip) doc.setOptions({ nullGetter: function () { //设置空值 undefined 为'' return ''; }, }); // 设置图片模块 doc.attachModule(new ImageModule(opts)); // 设置模板变量的值 doc.setData({ ...data, image:myChart.getDataURL({ pixelRatio: 5, //导出的图片分辨率比率,默认是1 backgroundColor: '#fff', //图表背景色 excludeComponents: ['toolbox'], //忽略组件的列表 type: 'png', //图片类型支持png和jpeg }), }) try { // 用模板变量的值替换所有模板变量 doc.render() } catch (error) { // 抛出异常 // const e = { // message: error.message, // name: error.name, // stack: error.stack, // properties: error.properties, // } console.error('导出报表失败') throw error } // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示) const out = doc.getZip().generate({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }) // 将目标文件对象保存为目标类型的文件,并命名 saveAs(out,`${docTitle}.doc`) }) }, 1000); } } }标签:vue,const,import,tagValue,文档,error,return,data,下载 From: https://www.cnblogs.com/watm/p/17466476.html