關於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模板放在的位置進行獲取,輸出位置自己設定就好了,最後是我們輸出的結果展示,可以看到名字相同的人已經進行了合併。
總結
第一次分享,不足的地方請指出,需要源碼請私信,看到後會及時處理。