vue項目導出word

一追驴、需要的js依賴

實現(xiàn)此功能需要使用到docxtemplater肛走、jszip-utilsjszip衣迷、FileSaver等js文件

1、docxtemplater

介紹

docxtemplater是一種郵件合并工具酱酬,它以編程方式使用壶谒,處理條件、循環(huán)岳悟,并且可以擴展為表格佃迄、HTML、圖像等贵少。

參考鏈接:https://docxtemplater.readthedocs.io/en/latest/index.html

用到的API

  • new window.docxtemplater:
    創(chuàng)建docxtemplater實例對象呵俏,返回一個新的docxtemplater對象
  • loadZip(zip):
    docxtemplater對象加載zip實例
    注意:必須從jszip的2.x版本向該方法傳遞一個zip實例
  • setData(Tags):
    設置模板變量的值
  • render():
    此函數(shù)用模板變量的值替換所有模板變量
  • getZip():
    此函數(shù)返回代表docxtemplater對象的zip

2、jszip-utils

介紹

jszip-utils是與jszip一起使用的跨瀏覽器的工具庫

參考鏈接:https://stuk.github.io/jszip-utils/

用到的API

  • getBinaryContent():
    讀取并獲得模板文件的二進制內(nèi)容

3滔灶、jszip

介紹

jszip是一個用于創(chuàng)建普碎、讀取和編輯.zip文件的JavaScript庫,且API的使用也很簡單录平。

參考鏈接:https://stuk.github.io/jszip/

用到的API

  • new JSZip():
    創(chuàng)建一個JSZip實例
  • generate():
    此函數(shù)可以生成一個zip文件(不是一個真實的文件麻车,而是在內(nèi)存中的表示)

4缀皱、FileSaver

介紹

FileSaver.js 是在客戶端保存文件的解決方案,非常適合需要生成文件动猬,或者保存不應該發(fā)送到外部服務器的敏感信息的應用啤斗。

參考鏈接:
https://www.cnblogs.com/yunser/p/7629399.html
https://www.npmjs.com/package/file-saver

用到的API

  • saveAs(blob, "1.docx"):
    將目標文件對象保存為目標類型的文件,并命名

二赁咙、實現(xiàn)步驟

1钮莲、完成word模板

首先,根據(jù)需要導出的word文件的要求彼水,先使用word制作出模板崔拥,數(shù)據(jù)使用{變量}
代替。如下圖:

word模板.png

注意:
模板文件推薦放在靜態(tài)目錄文件下凤覆。
使用vue-cli2的時候链瓦,放在static目錄下。使用vue-cli3的時候盯桦,放在public目錄下慈俯。
因為我在使用的時候,放入.vue文件的同級目錄下拥峦,發(fā)現(xiàn)會讀不到模板肥卡。

2、寫出頁面模板

頁面代碼:

<template>
  <div class="threeLevelMain">
    <!-- 報價容器 -->
    <div class="quoteContainer">
      <!-- 報價頂部信息 -->
      <div class="quote_info clearfix">
        <h3 class="h3_title">報價單</h3>
        <div class="quote_itemBox">
          <div class="quote_item">
            <span class="quote_label">客戶名稱:</span>
            <p class="quote_p">{{form.custName}}</p>
          </div>
          <div class="quote_item">
            <span class="quote_label">聯(lián)系方式:</span>
            <p class="quote_p">{{form.phoneNumber}}</p>
          </div>
        </div>
        <div class="quote_itemBox">
          <div class="quote_item">
            <span class="quote_label">項目要求:</span>
            <p class="quote_p">{{form.projectRequirement}}</p>
          </div>
          <div class="quote_item">
            <span class="quote_label">備注:</span>
            <p class="quote_p">{{form.remark}}</p>
          </div>
        </div>
      </div>
      <!-- 設備選取表格 -->
      <div class="quote_table clearfix">
        <el-table
          border
          class="table_domQuote"
          ref="tableDomQuote"
          size="small"
          :data="tableData"
          style="width: 100%"
        >
          <el-table-column prop="number" width="80" label="序號" align="center"></el-table-column>
          <el-table-column label="設備名稱" prop="name" align="center"></el-table-column>
          <el-table-column label="數(shù)量" prop="num" align="center"></el-table-column>
          <el-table-column prop="salePrice" label="銷售單價" align="center"></el-table-column>
          <el-table-column prop="saleTotal" label="銷售合計" align="center"></el-table-column>
          <el-table-column label="備注" prop="remark" align="center"></el-table-column>
          <div slot="append">
            <div class="quoteTable">
              <span class="quoteTable_sp1">合計:</span>
              <span class="quoteTable_sp1">{{form.totalPrice}}</span>
            </div>
          </div>
        </el-table>
      </div>
    </div>
    <!-- 審核備注容器 -->
    <div class="reasonBox clearfix">
      <div class="title_checkReason">審核備注:</div>
      <div class="checkReasonMain">
        <div class="p_box">
          <p class="p_checkReason">{{form.checkReason}}</p>
        </div>
      </div>
    </div>
    <!-- 底部按鈕容器 -->
    <div class="botmBtnContainer">
      <el-button @click="exportWord" size="small" type="primary">導出word</el-button>
    </div>
  </div>
</template>

頁面效果:

頁面效果.png

3事镣、script代碼

<script>
export default {
  name: "home",
  data() {
    return {
      // 表單對象
      form: {
        custName: "杰斯", // 客戶姓名
        phoneNumber: "138xxxxxxxx", // 聯(lián)系方式
        projectRequirement: "為了更美好的明天而戰(zhàn)", // 項目要求
        totalPrice: 140, // 合計報價
        remark: "QEWARAEQAAAAAAAAA", // 備注
        checkReason: '同意' // 審核備注
      },
      // 表格信息
      tableData: []
    };
  },
  created() {
    this.tableData = [
      {
        number: 1, // 序號
        name: "設備1", // 設備名稱
        num: 1, // 數(shù)量
        salePrice: 10, // 銷售單價
        saleTotal: 10, // 銷售合計
        remark: "啦啦啦" // 備注
      },
      {
        number: 2, // 序號
        name: "設備2", // 設備名稱
        num: 2, // 數(shù)量
        salePrice: 20, // 銷售單價
        saleTotal: 40, // 銷售合計
        remark: "啦啦啦" // 備注
      },
      {
        number: 3, // 序號
        name: "設備3", // 設備名稱
        num: 3, // 數(shù)量
        salePrice: 30, // 銷售單價
        saleTotal: 90, // 銷售合計
        remark: "啦啦啦" // 備注
      }
    ];
  },
  methods: {
    // 點擊導出word
    exportWord: function() {
      let _this = this;
      // 讀取并獲得模板文件的二進制內(nèi)容
      JSZipUtils.getBinaryContent("input.docx", function(error, content) {
        // input.docx是模板。我們在導出的時候揪胃,會根據(jù)此模板來導出對應的數(shù)據(jù)
        // 拋出異常
        if (error) {
          throw error;
        }
        
        // 創(chuàng)建一個JSZip實例璃哟,內(nèi)容為模板的內(nèi)容
        let zip = new JSZip(content);
        // 創(chuàng)建并加載docxtemplater實例對象
        let doc = new window.docxtemplater().loadZip(zip);
        // 設置模板變量的值
        doc.setData({
          ..._this.form,
          table: _this.tableData
        });
        
        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文件(不是一個真實的文件,而是在內(nèi)存中的表示)
        let out = doc.getZip().generate({
          type: "blob",
          mimeType:
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
        });
        // 將目標文件對象保存為目標類型的文件喊递,并命名
        saveAs(out, "報價單.docx");
      });
    }
  }
};
</script>

4随闪、測試結果

點擊導出的結果:


word效果.png

三、完整demo

碼云項目鏈接:https://gitee.com/guolin741/exportword

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骚勘,一起剝皮案震驚了整個濱河市铐伴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俏讹,老刑警劉巖当宴,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泽疆,居然都是意外死亡户矢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門殉疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯浪,“玉大人捌年,你說我怎么就攤上這事」衣澹” “怎么了礼预?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虏劲。 經(jīng)常有香客問我托酸,道長,這世上最難降的妖魔是什么伙单? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任获高,我火速辦了婚禮,結果婚禮上吻育,老公的妹妹穿的比我還像新娘念秧。我一直安慰自己,他們只是感情好布疼,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布摊趾。 她就那樣靜靜地躺著,像睡著了一般游两。 火紅的嫁衣襯著肌膚如雪砾层。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天贱案,我揣著相機與錄音肛炮,去河邊找鬼。 笑死宝踪,一個胖子當著我的面吹牛侨糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘩燥,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秕重,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厉膀?” 一聲冷哼從身側響起溶耘,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎服鹅,沒想到半個月后凳兵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡菱魔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年留荔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡聚蝶,死狀恐怖杰妓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碘勉,我是刑警寧澤巷挥,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站验靡,受9級特大地震影響倍宾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胜嗓,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一高职、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辞州,春花似錦怔锌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媚狰,卻和暖如春岛杀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崭孤。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工类嗤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辨宠。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓土浸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彭羹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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

  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實用庫 服務端 輔助工具 應用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,154評論 0 1
  • 本文基于工作項目開發(fā)泪酱,做的整理筆記因工作需要派殷,項目框架由最初的Java/jsp模式,逐漸轉移成node/expre...
    SeasonDe閱讀 7,447評論 3 35
  • 我知道世界上有很多不同的人 有外表看起來乖巧但性格暴躁的 也有膽小怕事處處小心行事的 我應該是屬于后者吧墓阀,比較注重...
    KiAile_0426閱讀 200評論 0 1
  • 時間的概念是人類創(chuàng)造的斯撮,至于最初是基于什么原因经伙,我不知道也并不感興趣。時間算是敏感詞語,有的時候我們忙碌帕膜,時間就跑...
    寄居貓_d5d0閱讀 356評論 0 0
  • 深秋的葉子經(jīng)過炎炎的夏日枣氧,還是很碧綠青蔥的樣貌,空氣清鮮得象洗過肺后的呼吸垮刹,人們隨意在濃密的樹蔭下达吞,有看書的年輕伴...
    見人_d6ee閱讀 238評論 0 0