当前位置:   article > 正文

poi-tl导出word复杂表格(单元格合并)_poi-tl 合并单元格

poi-tl 合并单元格

poi-tl 是基于 Apache POI ,使用时请注意poi的版本依赖冲突问题

 添加依赖

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>4.1.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>4.1.2</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.deepoove</groupId>
  13. <artifactId>poi-tl</artifactId>
  14. <version>1.10.3</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>commons-io</groupId>
  18. <artifactId>commons-io</artifactId>
  19. <version>2.11.0</version>
  20. </dependency>

模板文件内容(我这里用的是下面那个模板内容)

代码

  1. import com.deepoove.poi.data.RowRenderData;
  2. import java.util.List;
  3. import java.util.Map;
  4. public class ServerTableData {
  5. /**
  6. * 携带表格中真实数据
  7. */
  8. private List<RowRenderData> serverDataList;
  9. /**
  10. * 携带要分组的信息
  11. */
  12. private List<Map<String, Object>> groupDataList;
  13. /**
  14. * 需要合并的列,从0开始
  15. */
  16. private Integer mergeColumn;
  17. public List<RowRenderData> getServerDataList() {
  18. return serverDataList;
  19. }
  20. public void setServerDataList(List<RowRenderData> serverDataList) {
  21. this.serverDataList = serverDataList;
  22. }
  23. public List<Map<String, Object>> getGroupDataList() {
  24. return groupDataList;
  25. }
  26. public void setGroupDataList(List<Map<String, Object>> groupDataList) {
  27. this.groupDataList = groupDataList;
  28. }
  29. public Integer getMergeColumn() {
  30. return mergeColumn;
  31. }
  32. public void setMergeColumn(Integer mergeColumn) {
  33. this.mergeColumn = mergeColumn;
  34. }
  35. }

  1. import com.deepoove.poi.data.RowRenderData;
  2. import com.deepoove.poi.policy.DynamicTableRenderPolicy;
  3. import com.deepoove.poi.policy.TableRenderPolicy;
  4. import com.deepoove.poi.util.TableTools;
  5. import org.apache.commons.collections4.CollectionUtils;
  6. import org.apache.poi.xwpf.usermodel.XWPFTable;
  7. import org.apache.poi.xwpf.usermodel.XWPFTableRow;
  8. import java.util.List;
  9. import java.util.Map;
  10. public class ServerTablePolicy extends DynamicTableRenderPolicy {
  11. @Override
  12. public void render(XWPFTable xwpfTable, Object tableData) throws Exception {
  13. if (null == tableData) {
  14. return;
  15. }
  16. // 参数数据声明
  17. ServerTableData serverTableData = (ServerTableData) tableData;
  18. List<RowRenderData> serverDataList = serverTableData.getServerDataList();
  19. List<Map<String, Object>> groupDataList = serverTableData.getGroupDataList();
  20. Integer mergeColumn = serverTableData.getMergeColumn();
  21. if (CollectionUtils.isNotEmpty(serverDataList)) {
  22. // 先删除一行, demo中第一行是为了调整 三线表 样式
  23. // xwpfTable.removeRow(1);//如果表单里面只有一行表头信息的话,这里设置成1
  24. xwpfTable.removeRow(2);//如果表单里面有两行数据,则设置成2
  25. // 行从中间插入, 因此采用倒序渲染数据
  26. for (int i = serverDataList.size() - 1; i >= 0; i--) {
  27. // XWPFTableRow newRow = xwpfTable.insertNewTableRow(1);//从表单的哪行开始插入数据,一般表单有一个标题,所以这里设置1;
  28. XWPFTableRow newRow = xwpfTable.insertNewTableRow(2);//从表单的哪行开始插入数据,如果表单里面有两行,这是设置成2
  29. // newRow.setHeight(400);
  30. for (int j = 0; j < 3; j++) {//因为我的表单是3列,所以这里是3
  31. newRow.createCell();
  32. }
  33. // 渲染一行数据
  34. TableRenderPolicy.Helper.renderRow(newRow, serverDataList.get(i));
  35. }
  36. // 处理合并
  37. for (int i = 0; i < serverDataList.size(); i++) {
  38. // 获取要合并的名称那一列数据 mergeColumn代表要合并的列,从0开始
  39. String typeNameData = serverDataList.get(i).getCells().get(mergeColumn).getParagraphs().get(0).getContents().get(0).toString();
  40. for (int j = 0; j < groupDataList.size(); j++) {
  41. String typeNameTemplate = String.valueOf(groupDataList.get(j).get("typeName"));
  42. int listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("listSize")));
  43. if(listSize == 1){
  44. continue;
  45. }
  46. // 若匹配上 就直接合并
  47. if (typeNameTemplate.equals(typeNameData)) {
  48. // TableTools.mergeCellsVertically(xwpfTable, 0, i + 1, i + listSize);//如果表单里面只有一行表头信息的话,用这个语句
  49. TableTools.mergeCellsVertically(xwpfTable, 0, i + 2, i + 1 + listSize);//如果表单里面有两行数据,则用这个语句
  50. groupDataList.remove(j);
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }
  1. import com.deepoove.poi.XWPFTemplate;
  2. import com.deepoove.poi.config.Configure;
  3. import com.deepoove.poi.config.ConfigureBuilder;
  4. import com.deepoove.poi.data.RowRenderData;
  5. import com.deepoove.poi.data.Rows;
  6. import com.deepoove.poi.util.PoitlIOUtils;
  7. import org.apache.poi.xwpf.usermodel.XWPFTable;
  8. import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
  9. import java.io.*;
  10. import java.util.*;
  11. public class PreTestExport {
  12. public static void main(String[] args) throws Exception{
  13. // 获取模板文件流
  14. // InputStream resourceAsStream = new FileInputStream(new File("E:/word/poi-tl-pre-old2.docx"));
  15. InputStream resourceAsStream = new FileInputStream(new File("E:/word/poiaa.docx"));
  16. //poi-tl 配置
  17. ConfigureBuilder builder = Configure.builder();
  18. builder.useSpringEL(false);
  19. Map<String,Object> map = new HashMap<String,Object>();
  20. // 伪造一个表格数据
  21. //单个表格
  22. ServerTableData oneTable = getServerTableData();
  23. map.put("oneTable",oneTable);
  24. map.put("title", "2023");
  25. builder.bind("oneTable",new ServerTablePolicy());
  26. XWPFTemplate template = XWPFTemplate.compile(Objects.requireNonNull(resourceAsStream), builder.build()).render(map);
  27. // 获取表格对象
  28. XWPFTable table = template.getXWPFDocument().getTableArray(0);
  29. // 设置表格边框样式为黑色实线
  30. CTTblPr tblPr = table.getCTTbl().getTblPr();
  31. CTTblBorders tblBorders = tblPr.isSetTblBorders() ? tblPr.getTblBorders() : tblPr.addNewTblBorders();
  32. CTBorder border = tblBorders.addNewTop();
  33. border.setVal(STBorder.SINGLE);
  34. border.setColor("000000");
  35. // HttpServletResponse response
  36. OutputStream out = new FileOutputStream(new File("E:/word/poi-tl-降水new.docx"));
  37. BufferedOutputStream bos = new BufferedOutputStream(out);
  38. template.write(bos);
  39. bos.flush();
  40. out.flush();
  41. PoitlIOUtils.closeQuietlyMulti(template, bos, out);
  42. }
  43. private static ServerTableData getServerTableData() {
  44. ServerTableData serverTableData = new ServerTableData();
  45. List<RowRenderData> serverDataList = new ArrayList<RowRenderData>();
  46. RowRenderData serverData1 = Rows.of("广州", "天河", "0.3").textFontSize(14).center().create();
  47. RowRenderData serverData2 = Rows.of("广州", "白云", "0.2").textFontSize(14).center().create();
  48. RowRenderData serverData3 = Rows.of("广州", "东山", "0.1").textFontSize(14).center().create();
  49. serverDataList.add(serverData1);
  50. serverDataList.add(serverData2);
  51. serverDataList.add(serverData3);
  52. RowRenderData fs = Rows.of("佛山", "禅城", "0.3").textFontSize(14).center().create();
  53. serverDataList.add(fs);
  54. RowRenderData sz1 = Rows.of("深圳", "南山", "0.3").textFontSize(14).center().create();
  55. RowRenderData sz2 = Rows.of("深圳", "福田", "0.3").textFontSize(14).center().create();
  56. serverDataList.add(sz1);
  57. serverDataList.add(sz2);
  58. List<Map<String, Object>> groupDataList = new ArrayList<Map<String, Object>>();
  59. Map<String, Object> groupData1 = new HashMap<String, Object>();
  60. groupData1.put("typeName", "广州");
  61. groupData1.put("listSize", "3");
  62. Map<String, Object> groupData2 = new HashMap<String, Object>();
  63. groupData2.put("typeName", "深圳");
  64. groupData2.put("listSize", "2");
  65. Map<String, Object> groupData3 = new HashMap<String, Object>();
  66. groupData3.put("typeName", "佛山");
  67. groupData3.put("listSize", "1");
  68. groupDataList.add(groupData1);
  69. groupDataList.add(groupData2);
  70. groupDataList.add(groupData3);
  71. serverTableData.setServerDataList(serverDataList);
  72. serverTableData.setGroupDataList(groupDataList);
  73. serverTableData.setMergeColumn(0);
  74. return serverTableData;
  75. }
  76. }

结果

 

参考文档

https://blog.csdn.net/yuanay/article/details/127772831poi-tl导出表格,单元格合并https://blog.csdn.net/yuanay/article/details/127772831

poi-tl的使用(最全详解)_JavaSupeMan的博客-CSDN博客官网地址poi-tl,简单的说,就是通过一些标记,如{{text}},{{@image}}等,放到你指定的word模板里,然后去读取替换这些值,再输出填充数据后的word,可以做生成报表的功能注意apache.poi版本要对应二、准备工作在D盘,自己创建两个文件夹,一个是用来存储模板文件,另一个是用来存储生成的文件我这里是在D盘D:\data\template 存放模板D:\data\word 存放生成的文件注意,{{}}是官方指定的格式,可以查看官网,当然也可以自定义,这个后面来讲https://blog.csdn.net/JavaSupeMan/article/details/125654484

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/606780
推荐阅读
相关标签
  

闽ICP备14008679号