前端docxtemplater导出word文件,动态表格的导出方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用docxtemplater来导出word文件,遇到的动态表格问题。

一、导出动态表格的问题

当使用docxtemplater来导出文件时,如果表格的表头和数据都是动态不固定的。使用导出固定表格的方式,好像行不通,像这样
在这里插入图片描述
后面想用docxtemplater的html模块来弄,但是弄了很久发现,html模块好像是收费的(坑)。后面又摸索了很久,试了一下用xml的方法来生成动态表格,原理就是在准备word数据时就动态生成表格的xml数据格式,在模板上就只需要引用这个xml表格数据字段

二、使用方法

1.动态生成xml表格数据

代码如下(示例):

// 动态生成 XML 表格
generateXmlTable(tableConfig) {
    const { headers, rows, tableStyle = {} } = tableConfig;
    
    let xml = `<w:tbl>
        <w:tblPr>
            <w:tblW w:w="0" w:type="auto"/>
            <w:tblBorders>
                <w:top w:val="single" w:sz="4" w:color="000000"/>
                <w:left w:val="single" w:sz="4" w:color="000000"/>
                <w:bottom w:val="single" w:sz="4" w:color="000000"/>
                <w:right w:val="single" w:sz="4" w:color="000000"/>
                <w:insideH w:val="single" w:sz="4" w:color="000000"/>
                <w:insideV w:val="single" w:sz="4" w:color="000000"/>
            </w:tblBorders>
        </w:tblPr>
        <w:tblGrid>`;
    
    // 生成列定义
    headers.forEach(() => {
        xml += `<w:gridCol w:w="2000"/>`;
    });
    
    xml += `</w:tblGrid>`;
    
    // 表头
    xml += `<w:tr>`;
    headers.forEach(header => {
        xml += `
            <w:tc>
                <w:tcPr>
                    <w:shd w:val="clear" w:color="auto" w:fill="E6E6E6"/>
                </w:tcPr>
                <w:p>
                    <w:r>
                        <w:t>${header.label}</w:t>
                    </w:r>
                </w:p>
            </w:tc>`;
    });
    xml += `</w:tr>`;
    
    // 数据行
    rows.forEach(row => {
        xml += `<w:tr>`;
        headers.forEach(header => {
            xml += `
                <w:tc>
                    <w:p>
                        <w:r>
                            <w:t>${row[header.key] || ''}</w:t>
                        </w:r>
                    </w:p>
                </w:tc>`;
        });
        xml += `</w:tr>`;
    });
    
    xml += `</w:tbl>`;
    
    return xml;
}

2.在数据准备中使用

代码如下(示例):

// 在数据准备中使用
prepareXmlTableData(wordData) {
    const tableConfig = {
    //表头数据根据情况动态获取
        headers: [
            { key: 'name', label: '姓名' },
            { key: 'age', label: '年龄' },
            { key: 'department', label: '部门' },
            { key: 'salary', label: '薪资' }
        ],
        //表格数据,根据情况动态获取
        rows: [
            { name: '张三', age: '28', department: '技术部', salary: '¥15,000' },
            { name: '李四', age: '32', department: '市场部', salary: '¥12,000' }
        ]
    };
    //返回的就是表格的xml数据,复制给模板的表格数据字段
    return {
        dynamicTable: this.generateXmlTable(tableConfig)
    };
}

3.在模板中使用

使用{@模板的表格xml数据字段}将表格数据渲染到word文档里
在这里插入图片描述

总结

使用xml来对动态的表格数据进行展示

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值