由于列表表中的数据由于动态表单拖动而格式不固定,因此在最近的开发过程中出现了需求列表中的表单数据导出word。所需的方案是冻结word模板,然后从表单中取出模板字段,执行分配导出。具体的业务实施没有详细说明。下面的导出实现如下:
所需的相关插件
Docx模板
Pizzip
文件-服务器
Jszip-utils
Jszip
docx templater-image-module-free js zip:如果创建压缩包批量下载不需要批量处理,则不需要安装
docx templater-image-module-free:如果没有将设计导出到图片所需的安装,则不需要安装
安装
NPM I docx templater pizzip js zip-utils file-saver js zip docx templater-image-module-free-s处理逻辑
模板文件的二进制内容JSZi(';(error,content)={})2。文件-zip文件
Constzip=newpizzip(内容);3.创建和加载docxtemplater实例对象
Letdoc=newdocxtemplater()。loadzip (zip)。compile();4.上传资料
5.定义模板
模板
测试数据
测试数据
显示效果
图片密钥代码处理
批量下载处理
这里包装完毕下载结束时进行了延迟处理,防止操作不完全。
综合包装下
对上述分布式JS打包以创建新的ex。
import docx templater from ' docx templater '
Import PizZip from 'pizzip '
Import {saveAs} from 'file-saver '
导入Jsziputils from' jszip-utils '
导入js zip from' js zip '
import image module from ' docx templater-image-module-free '
export const dataurltobase 64=(URL)={
Return new promise ((resolve,reject)={
//验证监听地址是否已是base64
Cons
t base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/; if (url)) { return url; } const Img = new Image() let dataURL = '' Img.setAttribute('crossOrigin', 'Anonymous') Img.src = url + '?v=' + Ma() Img.onload = function () { // 要先确保图片完整获取到,这是个异步事件 const canvas = document.createElement('canvas') // 创建canvas元素 const width = Img.width // 确保canvas的尺寸和图片一样 const height = Img.height canvas.width = width canvas.height = height canvas.getContext('2d').drawImage(Img, 0, 0, width, height) // 将图片绘制到canvas中 dataURL = canvas.toDataURL('image/jpeg') // 转换图片为dataURL resolve(dataURL) } }) } export const exportWord = ({ file = "in;, data, filename = "下载文档", fileType = "docx", folder = "下载文档" } = {}) => { // 批量下载生成压缩包 const Zip = new JSZip() if (data)) { da((item, index) => { // 读取并获得模板文件的二进制内容 JSZi(file, (error, content) => { // in是模板。我们在导出的时候,会根据此模板来导出对应的数据 // 抛出异常 if (error) { throw error } // 图片处理 let opts = {} o = true; // 图片居中 o = (tagValue, tagName) => { return new Promise((resolve, reject) => { JSZi(tagValue, (error, content) => { if (error) { return reject(error); } return resolve(content); }); }); } o = () => { return [400, 200] } let imageModule = new ImageModule(opts); // 创建一个JSZip实例,内容为模板的内容 const zip = new PizZip(content); // 创建并加载docxtemplater实例对象 let doc = new docxtemplater().loadZip(zip).attachModule(imageModule).compile(); let word = Zip.folder(folder) doc.resolveData(item).then(() => { doc.render(); const out = doc.getZip().generate({ type: "blob", mimeType: "application;, }); word.file(`${i ? i : filename + index}.${fileType}`, out) }) con(word, 'word') }) }) setTimeout(() => { Zip.generateAsync({ type: "blob" }) // zip下载 .then((content) => { saveAs(content, `${folder}.zip`); // zip下载后的名字 }); }, 1000) } else { // 读取并获得模板文件的二进制内容 JSZi(file, (error, content) => { // 抛出异常 if (error) { throw error } // 图片处理 let opts = {} o = true; // 图片居中,在word模板中定义方式为{%image} o = (tagValue, tagName) => { return new Promise((resolve, reject) => { JSZi(tagValue, (error, content) => { if (error) { return reject(error); } return resolve(content); }); }); } o = () => { return [600, 300] } let imageModule = new ImageModule(opts); const zip = new PizZip(content); // 创建并加载docxtemplater实例对象 let doc = new docxtemplater().loadZip(zip).attachModule(imageModule).compile(); // 如果包含异步数据,用resolveData,在回调之后再处理,如果都是同步数据,直接用setData就可以 doc.resolveData(data).then(() => { try { // 用模板变量的值替换所有模板变量 doc.render(); // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示) const out = doc.getZip().generate({ type: "blob", mimeType: "application; }); // 将目标文件对象保存为目标类型的文件,并命名 saveAs(out, `${filename}.${fileType}`); } catch (error) { // 抛出异常 const e = { message: error.message, name: error.name, stack: error.stack, properties: error.properties }; con({ error: e })); throw error; } }) }); } }使用
导入上面定义的JS,使用exportWord方法
import {exportWord} from './exportWord' const config = { file: ";, filename:'下载文档', fileType:'docx', folder:'下载文档', data: {}// 数据 } exportWord(config)
参数说明:
参数 | 类型 | 默认值 | 说明 |
file | String | 模板文件的地址 | |
filename | String | 下载文档 | 文件名称 |
fileType | String | docx | 文件类型 |
folder | String | 下载文档 | 批量下载压缩包的文件名 |
data | Array/Object | {} | 数据(数组默认批量,对象默认单个下载) |
开发的过程中也看到了别人写的,也借鉴参考学到了很多,这地方再进行整合下希望能帮助到也需要相似功能的你们。
1.《【文件zip格式怎么转word】前端开发——模板导出word下载》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【文件zip格式怎么转word】前端开发——模板导出word下载》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2529603.html