由于列表表中的數(shù)據(jù)由于動態(tài)表單拖動而格式不固定,因此在最近的開發(fā)過程中出現(xiàn)了需求列表中的表單數(shù)據(jù)導(dǎo)出word。所需的方案是凍結(jié)word模板,然后從表單中取出模板字段,執(zhí)行分配導(dǎo)出。具體的業(yè)務(wù)實施沒有詳細(xì)說明。下面的導(dǎo)出實現(xiàn)如下:
所需的相關(guān)插件
Docx模板
Pizzip
文件-服務(wù)器
Jszip-utils
Jszip
docx templater-image-module-free js zip:如果創(chuàng)建壓縮包批量下載不需要批量處理,則不需要安裝
docx templater-image-module-free:如果沒有將設(shè)計導(dǎo)出到圖片所需的安裝,則不需要安裝
安裝
NPM I docx templater pizzip js zip-utils file-saver js zip docx templater-image-module-free-s處理邏輯
模板文件的二進(jìn)制內(nèi)容JSZi(';(error,content)={})2。文件-zip文件
Constzip=newpizzip(內(nèi)容);3.創(chuàng)建和加載docxtemplater實例對象
Letdoc=newdocxtemplater()。loadzip (zip)。compile();4.上傳資料
5.定義模板
模板
測試數(shù)據(jù)
測試數(shù)據(jù)
顯示效果
圖片密鑰代碼處理
批量下載處理
這里包裝完畢下載結(jié)束時進(jìn)行了延遲處理,防止操作不完全。
綜合包裝下
對上述分布式JS打包以創(chuàng)建新的ex。
import docx templater from ' docx templater '
Import PizZip from 'pizzip '
Import {saveAs} from 'file-saver '
導(dǎo)入Jsziputils from' jszip-utils '
導(dǎo)入js zip from' js zip '
import image module from ' docx templater-image-module-free '
export const dataurltobase 64=(URL)={
Return new promise ((resolve,reject)={
//驗證監(jiān)聽地址是否已是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') // 創(chuàng)建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') // 轉(zhuǎn)換圖片為dataURL resolve(dataURL) } }) } export const exportWord = ({ file = "in;, data, filename = "下載文檔", fileType = "docx", folder = "下載文檔" } = {}) => { // 批量下載生成壓縮包 const Zip = new JSZip() if (data)) { da((item, index) => { // 讀取并獲得模板文件的二進(jìn)制內(nèi)容 JSZi(file, (error, content) => { // in是模板。我們在導(dǎo)出的時候,會根據(jù)此模板來導(dǎo)出對應(yīng)的數(shù)據(jù) // 拋出異常 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); // 創(chuàng)建一個JSZip實例,內(nèi)容為模板的內(nèi)容 const zip = new PizZip(content); // 創(chuàng)建并加載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 { // 讀取并獲得模板文件的二進(jìn)制內(nèi)容 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); // 創(chuàng)建并加載docxtemplater實例對象 let doc = new docxtemplater().loadZip(zip).attachModule(imageModule).compile(); // 如果包含異步數(shù)據(jù),用resolveData,在回調(diào)之后再處理,如果都是同步數(shù)據(jù),直接用setData就可以 doc.resolveData(data).then(() => { try { // 用模板變量的值替換所有模板變量 doc.render(); // 生成一個代表docxtemplater對象的zip文件(不是一個真實的文件,而是在內(nèi)存中的表示) const out = doc.getZip().generate({ type: "blob", mimeType: "application; }); // 將目標(biāo)文件對象保存為目標(biāo)類型的文件,并命名 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; } }) }); } }使用
導(dǎo)入上面定義的JS,使用exportWord方法
import {exportWord} from './exportWord' const config = { file: ";, filename:'下載文檔', fileType:'docx', folder:'下載文檔', data: {}// 數(shù)據(jù) } exportWord(config)
參數(shù)說明:
參數(shù) | 類型 | 默認(rèn)值 | 說明 |
file | String | 模板文件的地址 | |
filename | String | 下載文檔 | 文件名稱 |
fileType | String | docx | 文件類型 |
folder | String | 下載文檔 | 批量下載壓縮包的文件名 |
data | Array/Object | {} | 數(shù)據(jù)(數(shù)組默認(rèn)批量,對象默認(rèn)單個下載) |
開發(fā)的過程中也看到了別人寫的,也借鑒參考學(xué)到了很多,這地方再進(jìn)行整合下希望能幫助到也需要相似功能的你們。
1.《【文件zip格式怎么轉(zhuǎn)word】前端開發(fā)——模板導(dǎo)出word下載》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【文件zip格式怎么轉(zhuǎn)word】前端開發(fā)——模板導(dǎo)出word下載》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/2529603.html