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

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

首先,准备word模板,放在以下文件路径:public/templates/签到表.docx
在这里插入图片描述
其次,设计组建,期望传入的参数如下:
exportData: 填充的数据
fileTemplete: 模板路径
fileName:文件名

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

实现代码如下

<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文件
在这里插入图片描述

### 实现 Vue.js 中导出 Word 文档 为了在 Vue.js 项目中实现导出 Word 文档的功能,可以选择多种方法和技术栈。以下是几种常见的方式及其对应的库: #### 方法一:使用 `file-saver` 和 `html-docx-js` 这种方法适用于简单的 HTML 转换为 DOCX 文件的需求。 安装所需的依赖项: ```bash npm install file-saver html-docx-js ``` 创建一个用于导出的方法,在 Vue 组件内定义如下逻辑: ```javascript import { saveAs } from 'file-saver'; import HtmlDocx from 'html-docx-js'; export default { methods: { exportToWord() { const content = '<h1>Hello, this is a heading</h1><p>This is some text.</p>'; const blob = new Blob([HtmlDocx.asBlob(content)], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }); saveAs(blob, 'document.docx'); } } } ``` 此代码片段展示了如何将一段 HTML 字符串转换成 Word 文档并触发下载[^1]。 #### 方法二:结合 QRCode 和 DocxTemplater 库 如果需求涉及更复杂的场景比如嵌入二维码,则可采用 qrcode 和 docxtemplater 的组合方案。 先安装必要的包: ```bash npm install qrcode docxtemplater jszip ``` 编写相应函数处理数据流以及生成最终文件: ```javascript import QRCode from 'qrcode'; import Docxtemplater from 'docxtemplater'; import PizZip from 'pizzip'; import PizZipUtils from 'pizzip/utils/index.js'; import { saveAs } from 'file-saver'; function loadFile(url, callback) { PizZipUtils.getBinaryContent(url, callback); } loadFile('/path/to/template.docx', function(error, content) { if (error) { throw error; } var zip = new PizZip(content); var doc = new Docxtemplater(zip); // Generate the QR code as an image URL. QRCode.toDataURL('https://example.com') .then(dataUrl => { doc.render({ qrImage: dataUrl, otherData: 'Some Text' }); let out = doc.getZip().generate({type:'blob'}); saveAs(out, 'output.docx'); }) }); ``` 这段脚本说明了怎样加载模板填充变量(含图片形式的二维码),最后保存结果到本地磁盘上[^2]。 #### 方法三:集成 TinyMCE 编辑器与 Mammoth 解析工具 对于那些希望提供所见即所得体验的应用程序来说,TinyMCE 是个不错的选择;而当涉及到从现有 Word 文档读取内容时,mammoth 可帮助解析这些文档的内容结构。 初始化环境前需执行命令行指令完成软件包获取: ```bash npm install @packy-tang/vue-tinymce mammoth file-saver jquery ``` 接着配置好 TinyMCE 并设置按钮事件响应来启动导出流程: ```javascript <template> <!-- ... --> <button v-on:click="handleExport">导出至 Word</button> </template> <script> // ... methods: { handleExport () { import(/* webpackChunkName: "mammoth" */'mammoth').then(mammoth => { const editorContent = this.$refs.editor.getContent(); fetch(editorContent).then(res => res.blob()).then(blob => { mammoth.convertToHtml({blob}).then(({value}) => { const wordBlob = new Blob([value], {'type': 'application/octet-stream'}) saveAs(wordBlob , 'editor-content.docx') }).catch(console.error) }) }) } } </script> ``` 上述例子解释了通过调用 Tinymce 获取当前编辑区内的 HTML 内容,并利用 Mammoth 将其转化为适合 Word 显示的形式再进行存储的过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝with黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值