1、模板
所有的标签都是以 {{开始,以}} 结束。
-
{{template}} 文本
-
{{@template}} 图片
-
{{#template}} 表格
-
{{*template}} 列表
-
{{+template}} Word 文档合并
-
{{?template}}{{/template}} if 和 foreach 功能
2、引入包
<!-- POI 依赖 使用xlsx xml的格式(即XSSFWorkbook) --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.17</version> </dependency> <!-- poi模板导入,主力包 --> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.1</version> </dependency>
3、代码片段
package entity; import com.deepoove.poi.data.TableRenderData; import lombok.Data; import java.util.ArrayList; import java.util.Map; /** * @program: ht * @ClassName TableData * @description: * @author: 黄涛 * @create: 2023-10-31 11:00 * @Version 1.0 **/ @Data public class TableData { /** * 标题 */ private String title; /** * 表格 */ private TableRenderData table; private String[][] tableList; /** * 总价 */ private String totalPrice; /** * 列表 */ private ArrayList<Object> itemList; }
TableData tableData = new TableData(); /* 假数据 */ tableData.setTitle("附件1-报价明细表"); String[][] strings = new String[20][5]; for (int i = 0; i < 20; i++) { strings[i] = new String[]{String.valueOf(i+1), "EREWHON"+i, "鸡蛋"+i, "维生素"+i, "675"+i}; } tableData.setTableList(strings); // 模版路径 String systemDir = System.getProperty("user.dir"); String wordPath = systemDir + "/staticFile/"; String modelName = "表格.docx"; // 手绘表格 // 表头 RowRenderData row0 = Rows.of("项号", "编号", "种类", "", "价格").center().create(); RowRenderData row1 = Rows.of("项号", "编号", "蛋白质", "微量元素", "价格").center().create(); int length = 0; if (tableData.getTableList() != null) { length = tableData.getTableList().length; } // 表格数据 加上2行表头 再加上最后一行总价 RowRenderData[] rowRenderData = new RowRenderData[length + 3]; rowRenderData[0] = row0; rowRenderData[1] = row1; // 计算价钱 BigDecimal totalPrice = new BigDecimal("0"); for (int i = 0; i < length; i++) { rowRenderData[i + 2] = Rows.of(tableData.getTableList()[i]).center().create(); String s = tableData.getTableList()[i][4]; BigDecimal bigDecimal = new BigDecimal(s); totalPrice = totalPrice.add(bigDecimal); } RowRenderData row4 = Rows.of("总价", "", "", "", totalPrice.toString()).center().create(); rowRenderData[rowRenderData.length - 1] = row4; // 表格合并,根据坐标 MergeCellRule rule = MergeCellRule.builder().map(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0)). map(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1)). map(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(0, 3)). map(MergeCellRule.Grid.of(0, 4), MergeCellRule.Grid.of(1, 4)). map(MergeCellRule.Grid.of(rowRenderData.length - 1, 0), MergeCellRule.Grid.of(rowRenderData.length - 1, 3)). build(); TableRenderData table = Tables.of(rowRenderData).mergeRule(rule).create(); // 数据封装 tableData.setTable(table); //插入列表 // 注意:此处用的是 <区块对> key是字符串,value则放置一个集合,类似于模板引擎的foreach标签 ArrayList<Object> stateList = CollUtil.newArrayList(); // 模拟从mysql查询数据,改造为word模板所需的数据结构 List<String> stateListFromMySQL = Arrays.asList("本人所递交的所有办理人才引进材料及填写的情况均属实;" , "我已认真阅读以上内容并确认;" , "若在申请期间信息变更不做变更。若违反,本人愿意承担由此产生的后果。"); for (int i = 0; i < stateListFromMySQL.size(); i++) { HashMap<String, Object> stateItem = new HashMap<>(); stateItem.put("item", stateListFromMySQL.get(i) + ""); stateList.add(stateItem); } tableData.setItemList(stateList); // 传入模板模板地址+信息数据 XWPFTemplate render = XWPFTemplate.compile(wordPath + modelName).render(tableData); // 此处是利用File,直接在本地创建文件,将参数替换后的文件流写入到该文件,word就是最终的结果 File word = new File(systemDir + "/downFile/" + File.separator + IdUtil.getSnowflake(1,1).nextId() + ".docx"); try { render.writeToFile(word.getAbsolutePath()); } catch (IOException e) { throw new RuntimeException(e); }
4、效果图
标签:java,String,表格,MergeCellRule,rowRenderData,Grid,new,tableData,模板 From: https://www.cnblogs.com/privateLogs/p/17799922.html