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");
    });
}

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

Vue3 中实现将表格数据导出为 A4 尺寸的 Word 文档,可以通过引入相关依赖库来完成。一种常见方法是使用 `docxtemplater` 或 `mammoth.js` 等库来生成 Word 文档,并通过设置文档样式确保输出尺寸符合 A4 标准。 ### 安装依赖 首先,需要安装用于生成 Word 文档的依赖包: ```bash npm install docxtemplater pizzip ``` 此外,如果希望控制页面布局(如 A4 尺寸),可以使用 `file-writer` 或 `axios` 结合后端服务处理更复杂的文档生成逻辑[^2]。 ### 导出 Word 文档的方法 接下来,可以在 Vue3 组件中编写一个方法,将表格数据转换为 Word 文档格式并下载: ```javascript import PizZip from 'pizzip'; import Docxtemplater from 'docxtemplater'; export function exportToWord(data, columns) { // 创建一个新的 Word 模板 const zip = new PizZip(); const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true }); // 构建 Word 表格内容 const tableRows = data.map(row => { const rowObject = {}; columns.forEach(col => { rowObject[col.key] = row[col.key]; }); return rowObject; }); // 设置模板变量 doc.setData({ table: tableRows, }); try { // 应用数据到模板 doc.render(); } catch (error) { console.error('Error generating document', error); return; } // 生成文档并下载 const out = doc.getZip().generate({ type: 'blob' }); saveAs(out, 'table_export.docx'); } ``` ### 在组件中调用导出函数 在 Vue3 组件中,可以绑定一个按钮点击事件来触发导出操作: ```vue <template> <button @click="exportTableToWord">导出 Word</button> </template> <script setup> import { exportToWord } from '@/utils/exportUtils'; const exportTableToWord = () => { // 假设 tableData 是当前组件中的表格数据,columns 是列定义 exportToWord(tableData.value, columns.value); }; </script> ``` ### 控制 Word 文档的 A4 页面大小 为了确保生成的 Word 文档符合 A4 尺寸标准,可以在生成文档时插入分页符或通过 CSS 样式定义页面大小。例如,在 Word 模板中添加以下 XML 样式定义: ```xml <w:sectPr> <w:pgSz w:w="11906" w:h="16838"/> <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/> </w:sectPr> ``` 以上代码表示设置页面宽度为 11906 twips、高度为 16838 twips(对应 A4 纸张尺寸)[^1]。 ---
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值