前端導出word文檔(基于vue)

工作中經(jīng)常會遇到根據(jù)不同數(shù)據(jù)導出文檔的情況场躯,現(xiàn)在我們就來看一下基于 docxtemplater 來導出word文檔的方法锐朴,使用起來非常便捷乃沙。

安裝依賴的插件

-- 安裝 docxtemplater
npm install docxtemplater pizzip  --save
-- 安裝 jszip-utils
npm install jszip-utils --save 
-- 安裝 jszip
npm install jszip --save
-- 安裝 FileSaver
npm install file-saver --save

下面簡單介紹一下這幾個插件的功能:

  • docxtemplater:docxtemplate是一個從docx/pptx模板生成docx/pptx文檔的庫。語法包含變量替換科阎、條件判斷煤裙、循環(huán)、列表循環(huán)蛤吓、表格循環(huán)等,還包括圖片糠赦、html等模塊轉換扑毡。
  • jszip-utils:jszip-utils是一個與 JSZip 一起使用的跨瀏覽器實用程序集合态蒂,詳細可參考 官網(wǎng)網(wǎng)址中的文檔袭景。
  • jszip: jszip是一個JavaScript類庫帚屉,用來操作.zip文件的工具贮泞,詳細可參考 官方網(wǎng)址 中的文檔蘸鲸。
  • file-saver:file-saver是在客戶端保存文件的解決方案荤堪,非常適合需要生成文件或者保存不應該發(fā)送到外部服務器的敏感信息的應用谜喊,詳細用法可參考 官方網(wǎng)址 中的文檔顺少。

創(chuàng)建exportFile.js(導出word方法)

  1. 引入依賴包
  2. 使用 jszip-utils 讀取并獲得模板文件的二進制內(nèi)容
  3. 使用 PizZip 創(chuàng)建實例朋其,內(nèi)容為模板的內(nèi)容
  4. 使用 docxtemplater 創(chuàng)建實例,并加載 PizZip 創(chuàng)建的實例
  5. 使用docxtemplater 創(chuàng)建實例設置導出數(shù)據(jù)脆炎,并用導出數(shù)據(jù)的值替換所有模板變量
  6. 生成一個代表docxtemplater對象的zip文件
  7. 使用 saveAs 將生成的zip文件對象保存為目標類型的文件梅猿,并命名
import PizZip from 'jszip';
import docxtemplater from 'docxtemplater';
import JSZipUtils from 'jszip-utils';
import { saveAs } from 'file-saver';

/**
 * 導出word,支持圖片
 * @param {Object} tempDocxPath 模板文件路徑
 * @param {Object} wordData 導出數(shù)據(jù)
 * @param {Object} fileName 導出文件名
 */
export const exportWord = (tempDocxPath, wordData, fileName) => {
  // 讀取并獲得模板文件的二進制內(nèi)容
  JSZipUtils.getBinaryContent(tempDocxPath, function (error, content) {
      if (error) {
        throw error;
      }

      // 創(chuàng)建一個PizZip實例,內(nèi)容為模板的內(nèi)容
      const zip = new PizZip(content);
      // 創(chuàng)建并加載docxtemplater實例對象
      const doc = new docxtemplater();
      doc.loadZip(zip);

      doc.setData(wordData);

      try {
        // 用模板變量的值替換所有模板變量
        doc.render();
      } catch (error) {
        // 拋出異常
        const e = {
          message: error.message,
          name: error.name,
          stack: error.stack,
          properties: error.properties
        };
        console.log(
          JSON.stringify({
            error: e
          })
        );
        throw error;
      }

      // 生成一個代表docxtemplater對象的zip文件(不是一個真實的文件秒裕,而是在內(nèi)存中的表示)
      const out = doc.getZip().generate({
        type: 'blob',
        mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
      });
      // 將目標文件對象保存為目標類型的文件袱蚓,并命名
      saveAs(out, fileName);
    }
  );
};

編寫word文檔模板,具體的寫法可以參考 docxtemplater demo 上的例子

下面列出幾中常見的 docxtemplater 語法

  1. 替換
    js中的變量定義:
{title:'簡介'}

word模板文件中語法:

{title}
  1. 循環(huán)
    js中的變量定義:
{
     loop:[
         { name: "Windows", price: 100},
         { name: "Mac OSX", price: 200 },
         { name: "Ubuntu", price: 0 }
    ],
    userGreeting: (scope) => {
        return "The product is" + scope.name + ", price:" + scope.price;
    },
}

word模板文件中語法:

循環(huán){#loop} 
    {name}, {price}
     // 匿名函數(shù)插槽用法
     {userGreeting}
{/loop}
  1. 判斷
    js中的變量定義:
{
    hasKitty: true,
    kitty: "Minie",
    hasDog: false,
    dog: "wangwang",
}

word模板文件中語法:

{#hasKitty}
    Cat’s name: {kitty}
{/hasKitty} 
{#hasDog}
    Dog’s name: {dog}
{/hasDog}
  1. 圖片
    js中的變量定義:
{
    //文件路徑
    image: '/logo.png',
}

word模板文件中語法:

{%image}

在組件中調(diào)用exportFile.js方法

import { exportWord } from '@/util/exportFile.js';

/**
* 參數(shù)1:模板文檔路徑
* 參數(shù)2:字段參數(shù)
* 參數(shù)3:輸出文檔
*/
const obj={
    ...
}
exportWord('template.docx' ,obj, '導出文件名.docx');

在這里關于模板文件的路徑 tempDocxPath 我們要著重說一下几蜻。
在使用的過程中應該有不少人會遇到這種報錯:Can't find end of central directory : is this a zip file ?

那這到底是什么原因導致的呢喇潘?
獲得模板文件的二進制內(nèi)容的方法,JSZipUtils.getBinaryContent(path, option) 提供path和option兩個參數(shù)梭稚。我們來看一下path颖低,前端開發(fā)最首先想到的可能是絕對路徑或者相對路徑,你可能還會用到@這個符號作為根目錄使用弧烤,但在這里你顯然不能這么用忱屑。

  1. 如果我們的模板文件為‘xxxx.docx’,那么我們的path應該為‘/xxxx.docx’。修改完這個地方之后莺戒,剩下的就是要知道你使用的vue-cli是版本2還是版本3伴嗡。如果是2,則應該有一個static的文件夾脏毯,請見你的模板文件放入這個static文件夾中闹究;如果是3,則有一個public文件夾食店,請將模板文件放入這個public文件夾中渣淤。
  2. 如果經(jīng)過上面的修改依然報錯,那么你就要看一下你的項目是不是微應用項目或者在項目路徑上做了什么處理吉嫩,如果是的話你需要根據(jù)項目目錄填寫xxxx.docx真正的路徑价认。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市自娩,隨后出現(xiàn)的幾起案子用踩,更是在濱河造成了極大的恐慌,老刑警劉巖忙迁,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐彩,死亡現(xiàn)場離奇詭異,居然都是意外死亡姊扔,警方通過查閱死者的電腦和手機惠奸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恰梢,“玉大人佛南,你說我怎么就攤上這事∏堆裕” “怎么了嗅回?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摧茴。 經(jīng)常有香客問我绵载,道長,這世上最難降的妖魔是什么蓬蝶? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任尘分,我火速辦了婚禮,結果婚禮上丸氛,老公的妹妹穿的比我還像新娘培愁。我一直安慰自己,他們只是感情好缓窜,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布定续。 她就那樣靜靜地躺著谍咆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪私股。 梳的紋絲不亂的頭發(fā)上摹察,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音倡鲸,去河邊找鬼供嚎。 笑死,一個胖子當著我的面吹牛峭状,可吹牛的內(nèi)容都是我干的克滴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼优床,長吁一口氣:“原來是場噩夢啊……” “哼劝赔!你這毒婦竟也來了?” 一聲冷哼從身側響起胆敞,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤着帽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后移层,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仍翰,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年观话,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉备。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡匪燕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喧笔,到底是詐尸還是另有隱情帽驯,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布书闸,位于F島的核電站尼变,受9級特大地震影響,放射性物質發(fā)生泄漏浆劲。R本人自食惡果不足惜嫌术,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牌借。 院中可真熱鬧度气,春花似錦、人聲如沸膨报。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至院领,卻和暖如春弛矛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背比然。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工丈氓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强法。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓万俗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拟烫。 傳聞我的和親對象是個殘疾皇子该编,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在項目中,我們可以借助后端返回文件流實現(xiàn)文件下載硕淑。如果前端有數(shù)據(jù)课竣,也可以借助前端框架進行下載。本文將介紹如何在前端...
    yichen_china閱讀 3,398評論 0 3
  • 在項目中置媳,我們可以借助后端返回文件流實現(xiàn)文件下載于樟。如果前端有數(shù)據(jù),也可以借助前端框架進行下載拇囊。本文將介紹如何在前端...
    Renaissance_閱讀 28,481評論 23 25
  • 1 public下面新建word文檔迂曲,填入Hi{nickName},nickName是字段名稱寥袭,在需要導出word...
    明月清風_0e6e閱讀 4,155評論 0 2
  • 操作步驟 1路捧、安裝插件 -- 安裝 docxtemplatercnpm install docxtemplater...
    sincereXY閱讀 2,356評論 0 1
  • 一、需要的js依賴 實現(xiàn)此功能需要使用到docxtemplater传黄、jszip-utils杰扫、jszip、FileS...
    GL曲終人散閱讀 40,296評論 47 16