在Vue3中生成動(dòng)態(tài)的word文檔的示例代碼
需求
在開(kāi)發(fā)過(guò)程中遇到一個(gè)需求,動(dòng)態(tài)生成一個(gè)word報(bào)表,當(dāng)時(shí)考慮了是前端做還是后端做的問(wèn)題,最后發(fā)現(xiàn)兩個(gè)解決需求的方法都大差不差,但考慮到前端少發(fā)一個(gè)請(qǐng)求,就此使用的前端來(lái)解決。
首先,我們需要安裝以下幾個(gè)庫(kù):
npm i docxtemplater 是一個(gè)用于基于模板生成動(dòng)態(tài) `.docx` 文檔的 JavaScript 庫(kù)。它允許你將動(dòng)態(tài)數(shù)據(jù)填充到 `.docx` 模板文件中
npm i jszip-utils 用于在瀏覽器中處理 ZIP 文件的工具庫(kù)
npm file-saver 是一個(gè)用于在瀏覽器中保存文件的 JavaScript 庫(kù)
創(chuàng)建一個(gè)工具函數(shù),用于加載 .docx
模板,填充數(shù)據(jù)并生成文檔。
//引入工具 import PizZip from 'pizzip'; import Docxtemplater from 'docxtemplater'; import JSZipUtils from 'jszip-utils'; import { saveAs } from 'file-saver'; // 加載 .docx 模板文件 function loadFile(url, callback) { JSZipUtils.getBinaryContent(url, callback); } // 下載生成的文檔 export function download(file, name) { saveAs(file, name); } // 生成并下載 Word 文檔(templatePath是word文檔模版地址,data是對(duì)應(yīng)的數(shù)據(jù)) export function generateWordDocument(templatePath, data) { return new Promise((resolve, reject) => { loadFile(templatePath, function (error, content) { if (error) { reject(new Error(`Error loading template file: ${error.message}`)); return; } try { // 加載模板文件內(nèi)容到 PizZip const zip = new PizZip(content); const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true, }); // 設(shè)置模板中的占位符數(shù)據(jù) doc.setData(data); // 渲染文檔 doc.render(); // 生成最終的文檔 Blob const fileWord = doc.getZip().generate({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', }); // 返回生成的文檔 Blob resolve(fileWord); } catch (error) { console.error('Error rendering document:', error); reject(new Error(`Error rendering document: ${error.message}`)); } }); }); }
在需要的組件內(nèi)調(diào)用
<template> <div> <button @click="startGeneration">生成文檔</button> <button @click="downloadWord" :disabled="!generatedFile">下載文檔</button> </div> </template> <script setup> import { ref } from 'vue'; import { generateWordDocument, download } from '../utils/wordGenerate.js'; const generatedFile = ref(null); // 模板文件的路徑,一般放在 public 目錄中 const templatePath = '/template.docx'; const data = { name: '測(cè)試', date: '2024-09-23' }; const startGeneration = async () => { try { generatedFile.value = await generateWordDocument(templatePath, data); console.log('文檔生成成功'); } catch (error){ console.error('Error generating document:', error); } }; //文檔下載 const downloadWord = () => { if (generatedFile.value) { download(generatedFile.value, 'generated-document.docx'); } else { console.error('No file generated'); }}; </script>
就此功能完成了,當(dāng)然如果需求是生成成功的同時(shí)就下載文檔,可以將下載功能直接寫(xiě)在生成功能內(nèi),就可以省去異步處理的代碼量。
到此這篇關(guān)于在Vue3中生成動(dòng)態(tài)的word文檔的示例代碼的文章就介紹到這了,更多相關(guān)Vue3生成動(dòng)態(tài)word內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue2.0 實(shí)現(xiàn)頁(yè)面緩存和不緩存的方式
今天小編就為大家分享一篇Vue2.0 實(shí)現(xiàn)頁(yè)面緩存和不緩存的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11vue?parseHTML函數(shù)源碼解析start鉤子函數(shù)
這篇文章主要為大家介紹了vue?parseHTML函數(shù)源碼解析start鉤子函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解
在vue中我們使用模板HTML語(yǔ)法來(lái)組建頁(yè)面的,使用render函數(shù)我們可以用js語(yǔ)言來(lái)構(gòu)建DOM,這篇文章主要介紹了vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件,需要的朋友可以參考下2023-02-02

vue中使用 pako.js 解密 gzip加密字符串的方法

詳解vue項(xiàng)目中實(shí)現(xiàn)圖片裁剪功能

vue 行為驗(yàn)證碼之滑動(dòng)驗(yàn)證AJ-Captcha使用詳解