學習分享: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模板放在的位置進行獲取,輸出位置自己設定就好了,最後是我們輸出的結果展示,可以看到名字相同的人已經進行了合併。

在這裏插入圖片描述


總結

第一次分享,不足的地方請指出,需要源碼請私信,看到後會及時處理。

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