前端vue + docxtemplater、jszip、jszip-utils实现word模板填充数据组件

前端vue + docxtemplater实现word模板填充数据组建

首先,准备word模板,放在以下文件路径:public/templates/签到表.docx

其次,设计组建,期望传入的参数如下:

exportData: 填充的数据

fileTemplete: 模板路径

fileName:文件名

javascript 复制代码
import FillDoc form 'FillDoc.vue'
        <FillDoc 
        	fileName="签到记录" 
        	fileTemplete="/templates/签到表.docx" 
        	:exportData="{
                    name1: '1111111',
                    name2: '2222222',
                    name3: '33333333',
                    name4: '4444444',
                    name5: '5555555',
                    name6: '6666666',
                    date1: '2023-11-11 18:00',
                    date2: '2023-11-11 18:00',
                    list: [{
                            index: '1',
                            value1: 'AA',
                            value2: 'BB',
                            value3: 'cc',
                            value4: 'dd',
                            value5: '',
                        },
                        {
                            index: '2',
                            value1: 'AA',
                            value2: 'BB',
                            value3: 'cc',
                            value4: 'dd',
                            value5: 'dd',
                        },
                    ]
                }"></FillDoc>

最后,创建实现填充word功能的组建:fillDoc.vue

使用到第三方包:

  • docxtemplater
  • jszip
  • jszip-utils

安装第三方包
npm install docxtemplater jszip jszip-utils -S

实现代码如下

javascript 复制代码
<template>
  <el-button type="primary" size="mini" class="word-box" @click="exportWord">下载打印{{fileName}}</el-button>
</template>

<script>
    import Docxtemplater from 'docxtemplater';
    import JSZip from 'jszip';
    import JSZipUtils from 'jszip-utils';
    import {
        saveAs
    } from 'file-saver';
    import printJS from 'print-js'

    export default {
        name: 'Docx',
        props: {
            fileName: {
                type: String, // 输出文件名
                default: ''
            },
            fileTemplete: {
                type: String, // public下存放的word模板名称
                default: ''
            },
            exportData: {
                type: Object, // 导出的word数据
                default: () => {
                    return {}
                }
            }
        },
        data() {
            return {
                wordPreviewVisible: false
            }
        },
        methods: {
       
            // 点击导出word
            exportWord() {
                // 读取并获得模板文件的二进制内容
                JSZipUtils.getBinaryContent(this.fileTemplete, (error, content) => {
                    // 抛出异常
                    if (error) throw error;
                    // 创建一个JSZip实例,内容为模板的内容
                    let zip = new JSZip(content);
                    // 创建并加载docxtemplater实例对象
                    let doc = new Docxtemplater();
                    doc.loadZip(zip);
                    // 设置模板变量的值
                    doc.setData({
                        ...this.exportData
                    });
                    try {
                        // 用模板变量的值替换所有模板变量
                        doc.render();
                    } catch (error) {
                        // 抛出异常
                        let e = {
                            message: error.message,
                            name: error.name,
                            stack: error.stack,
                            properties: error.properties
                        };
                        console.log(JSON.stringify({
                            error: e
                        }));
                        throw error;
                    }
                    // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
                    let out = doc.getZip().generate({
                        type: 'blob',
                        mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
                    });
                        // 下载
                        saveAs(out, this.fileName + '.docx');
                });
            },
            readDocx(blob) {
                docx.renderAsync(blob, this.$refs.word)
                    .then(
                        (previewRes) =>{
                            console.log('docx preview:', previewRes)
                        }
                    );
            },
    }

最后,测试实现效果,成功导出填充的word文件

相关推荐
shadowflies4 分钟前
组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
前端·javascript·vue.js·vue·tdesign
LCG元15 分钟前
Vue.js组件开发-图片加载失败自动显示默认图片
vue.js
GesLuck35 分钟前
C#控件开发3—文本显示、文本设值
前端·c#
轻口味41 分钟前
【每日学点鸿蒙知识】屏幕高度、证书签名、深色模式对上架影响、Taskpool上下文、List触底加载更多
前端·华为·harmonyos
webmote1 小时前
Fabric.js 入门教程:扩展自定义对象的完整实践(V6)
运维·javascript·canvas·fabric·绘图
冴羽1 小时前
Solid.js 最新官方文档翻译(12)—— 派生信号与 Memos
前端·javascript·react.js
新中地GIS开发老师2 小时前
25考研希望渺茫,工作 VS 二战,怎么选?
javascript·学习·考研·arcgis·地理信息科学·地信
萧大侠jdeps2 小时前
Vue 3 与 Tauri 集成开发跨端APP
前端·javascript·vue.js·tauri
Running_slave3 小时前
搭建Nestjs+TypeORM+TS服务端应用架构
前端·后端·nestjs
JYeontu3 小时前
实现一个动态脱敏指令,输入时候显示真实数据,展示的时候进行脱敏
前端·javascript·vue.js