学习分享:POI-TL 导出Word复杂表格合并分享


关于POI-TL 导出Word的一些使用

最近在做项目时候遇到的一个关于导出Word的文件的需求,简单的数据展示可以根据POI-TL的官方的文档还是可以做出来的,但是有一些表格的合并处理poi-tl只是给了简单例子,前期的学习可以参考POI-TL(http://deepoove.com/poi-tl/)官方文档,及给出的一些简单的源码(https://github.com/Sayi/poi-tl),话不多说上代码


提示:以下是本篇文章正文内容,下面案例可供参考

一、前期准备?

<font color=#999AAA

Apache POI 4.1.2+
JDK 1.8+

这个地方需要注意的是:要根据自己项目的JDK来引入的对应版本的,POI-TL 官方给出来的JDK对应的版本要求
在这里插入图片描述

二、代码演示

1.数据结构

public class DocData {
   
     
    private String title;
    private String date;
    private TableRenderData renderData;
}

在这里插入图片描述

GET SET方法就省略了,这个数据结构换成你自己需要的数据结构就可以了,图片是对应的WORD 模板,{ {}}里面放入对象中对应的属性,{ {#}}是获取TableRenderData 表格数据的方式,这些都可以在POI-TL官方学习到

2.代码示例

2.1 写入表头表体的数据

		DocData docData = new DocData();
        TableRenderData renderData = new TableRenderData();
        //设置的合并规则
        MergeCellRule.MergeCellRuleBuilder mergeCellRuleBuilder = MergeCellRule.builder();
        //设置表头
        RowRenderData header = Rows.of("姓名", "特长", "是否获奖").bgColor("F2F2F2").center()
                .textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create();
        //表体内容
        RowRenderData row = Rows.of("小红", "游泳", "否").center().create();
        RowRenderData row1 = Rows.of("小红", "钢琴", "八级").center().create();
        RowRenderData row2 = Rows.of("小红", "围棋", "否").center().create();
        RowRenderData row3 = Rows.of("小明", "游泳", "全国一等奖").center().create();
        RowRenderData row4 = Rows.of("小明", "击剑", "无").center().create();
        RowRenderData row5 = Rows.of("小梅", "围棋", "无").center().create();
        RowRenderData row6 = Rows.of("小梅", "跆拳道", "黑带").center().create();
        RowRenderData row7 = Rows.of("小梅", "长跑", "国家一级运动员").center().create();
        RowRenderData row8 = Rows.of("小梅", "举重", "无").center().create();
        RowRenderData row9 = Rows.of("小刚", "脸特长", "").center().create();

可以看出我们设置了表头内容分别是姓名、特长、获奖情况。姓名是重复的数据,我们希望将相同的姓名合并在一起,我们需要用到 **MergeCellRule.MergeCellRuleBuilder mergeCellRuleBuilder = MergeCellRule.builder();**设置合并的规则

2.2 设置合并规则

代码中标明注释,表格的合并根据自己的需求去设置规则。

		//设置样式颜色尺寸等等
        TableStyle.BorderStyle borderStyle = new TableStyle.BorderStyle();
        borderStyle.setColor("A6A6A6");
        borderStyle.setSize(4);
        borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
        TableRenderData tableRenderData = Tables.ofA4MediumWidth().addRow(header)
                .addRow(row).addRow(row1).addRow(row2).addRow(row3).addRow(row4)
                .addRow(row5).addRow(row6).addRow(row7).addRow(row8).addRow(row9)
                .border(borderStyle).center()
                .create();
        /**
         * 设置表格合并规则
         * 1.起始行 MergeCellRule.Grid.of(i, j) i: 行 j: 列
         * 2.结束行 MergeCellRule.Grid.of(i, j) i: 行 j: 列
         */
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(1, 0), MergeCellRule.Grid.of(3, 0));//小红合并
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(4, 0), MergeCellRule.Grid.of(5, 0));//小明合并
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(6, 0), MergeCellRule.Grid.of(9, 0));//小梅合并

        /**
         * MergeCellRule支持多合并规则,会以Map的形式存入可以看一下源码
         * !!! 一定要设置完规则后再调用 MergeCellRule的build方法进行构建
         */
        tableRenderData.setMergeRule(mergeCellRuleBuilder.build());

2.3 输出结果

		docData.setTitle("测试测试测试");
        docData.setDate(DateUtil.formatAsDatetime(new Date()));
        docData.setRenderData(tableRenderData);
        File file = ResourceUtils.getFile("D:\\Java\\ideawork\\word\\target\\test-classes\\demo.docx");
        XWPFTemplate template = XWPFTemplate.compile(file).render(docData);
        template.writeToFile("D:\\测试例子.docx");

这里获取的是绝对路径,根据自己WORD模板放在的位置进行获取,输出位置自己设定就好了,最后是我们输出的结果展示,可以看到名字相同的人已经进行了合并。

在这里插入图片描述


总结

第一次分享,不足的地方请指出,需要源码请私信,看到后会及时处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章