vue 将列表中的数据导出为word文件

本文介绍如何在Vue项目中实现列表数据导出为Word文件。通过安装docxtemplater、jszip-utils、jszip和FileSaver等依赖,引入模板,将列表数据替换到Word模板中,最后调用导出方法,完成数据的Word格式导出。

需求:
点击“导出”按钮,将列表中的数据导出为word文件。

1.安装依赖。

需要的插件:docxtemplater、jszip-utils、jszip、FileSaver。

cnpm install docxtemplater pizzip --save-dev
cnpm install jszip-utils --save 
cnpm install jszip --save
cnpm install file-saver --save

2.引入依赖包。

import docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import {saveAs} from 'file-saver'

3.添加word模板。

(1)首先,根据需要导出的word文件的要求,先使用word制作出模板,数据使用{变量}代替。
比如:
在这里插入图片描述
(2)将word模板添加到项目中。
注意:
模板文件推荐放在静态目录文件下。
使用vue-cli2的时候,放在static目录下。使用vue-cli3的时候,放在public目录下。
在这里插入图片描述

4.在组件中使用。

<div>
   <el-table :data="dataList" stripe fit v-loading="tableLoading">
       <el-table-column label="序号" type="index" width="50" align="center"></el-table-column>
       <el-table-column prop="enterpriseName" label="企业名称" align="center" ></el-table-column>
       <el-table-column prop="year" label="年份" align="center"></el-table-column>
       <el-table-column prop="quarter" label="季度" align="center"></el-table-column>
       <el-table-column prop="validUntil" label="有效期至" align="center"></el-table-column>
       <el-table-column prop="totalContract" label="签订合同额" align="center"></el-table-column>
       <el-table-column prop="lastContract" label="上年结转合同额" align="center"></el-table-column>
       <el-table-column prop="currentContract" label="本年新签合同额" align="center"></el-table-column>

       <!-- 操作区 -->
       <el-table-column label="操作" align="center">
           <template slot-scope="scope">
               <el-button type="text" size="small" @click="detailData(scope.row)">详情</el-button>
               <el-button type="text" size="small" @click="exportWord(scope.row)">导出</el-button>
           </template>
       </el-table-column>
   </el-table>

   <!-- 页码区 -->
   <div class="block">
       <el-pagination
           @size-change="handleSizeChange"
           @current-change="handleCurrentChange"
           :current-page="page.curPage"
           :page-sizes="[10, 15, 20, 30]"
           :page-size="page.size"
           layout="total, sizes, prev, pager, next, jumper"
           :total="page.total">
       </el-pagination>
   </div>
</div>

js方法:

// 导出word
exportWord: function(row) {
    let that = this;
    // 读取并获得模板文件的二进制内容
    JSZipUtils.getBinaryContent("../../static/file/outputValue.docx", function(error, content) {
        // model.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据
        // 抛出异常
        if (error) {
            throw error;
        }

        // 创建一个PizZip实例,内容为模板的内容
        let zip = new PizZip(content);
        // 创建并加载docxtemplater实例对象
        let doc = new docxtemplater().loadZip(zip);
        // 设置模板变量的值
        let docxData = {
        	enterpriseName: row.enterpriseName,
            year: row.year,
            quarter: row.quarter,
            validUntil: row.validUntil,
            totalContract: row.totalContract,
            lastContract: row.lastContract,
            currentContract: row.currentContract,
            totalProject: row.totalProject,
            oneselfProject: row.oneselfProject,
            subpackageProject: row.subpackageProject,
            otherProject: row.otherProject,
            totalValue: row.totalValue,
            distributionValue: row.distributionValue,
            decorateValue: row.decorateValue,
            otherProvincesValue: row.otherProvincesValue,
            buildingValue: row.buildingValue,
            installationValue: row.installationValue,
            otherValue: row.otherValue,
            completedValue: row.completedValue,
            constructionArea: row.constructionArea,
            newArea: row.newArea,
            steel: row.steel,
            wood: row.wood,
            cement: row.cement,
            sheetGlass: row.sheetGlass
        };
        doc.setData({
            ...docxData
        });

        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, "建筑业企业生产经营情况.docx");
    });
}

最终实现:
在这里插入图片描述

评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值