poi-tl自定义渲染策略学习

文章目录

    • 实现逻辑
    • 参考代码
    • 注意点

实现逻辑

自定义渲染策略实现逻辑:

  • 找到模板中的表格标签
  • render方法接收java中对应模板表格标签的所有list数据
  • 执行自定义渲染逻辑

参考代码

word模板如下:
在这里插入图片描述
实体类:

@Data
public class GksxRowData {/*** problemType 问题类型*/private String problemTypeDesc;/*** 序号*/private String num;/*** problemContent 问题描述*/private String problemContent;/*** problemScore 扣除分值*/private BigDecimal problemScore;/*** 1集团巡视审计专项检查的长度*/private Integer typeOneSize;/*** 2集团研发专项检查的长度*/private Integer typeTwoSize;
}@Data
public class GksxTableData {/*** 待渲染的数据 (扣分详细+合计)*/private List<GksxRowData> gksxRowDataList;}@Data
public class JxWordExport {/*** 管控事项table表格*/private GksxTableData gksxTable;
}

自定义渲染策略类:

@Slf4j
public class TemplateGksxTablePolicy extends DynamicTableRenderPolicy {@Overridepublic void render(XWPFTable table, Object data) throws Exception {if(data == null){log.error("待渲染管控事项数据为空。");return;}GksxTableData gksxTableData =  (GksxTableData) data;List<GksxRowData> problemList = gksxTableData.getGksxRowDataList();// 设置样式Style style = getStyle();// 循环插入行int startRow = 2;for (int i = 0; i < problemList.size(); i++) {// 先生成一行XWPFTableRow insertNewTableRow = table.insertNewTableRow(startRow+i);// 每一行有4列for (int j = 0; j < 4; j++) insertNewTableRow.createCell();// 封装数据GksxRowData gksxRowData = problemList.get(i);RowRenderData templateGksxRow = Rows.of(new TextRenderData(gksxRowData.getProblemTypeDesc(),style),new TextRenderData(gksxRowData.getNum(),style),new TextRenderData(gksxRowData.getProblemContent(),style),new TextRenderData(String.valueOf(gksxRowData.getProblemScore()),style)).center().create();// 渲染数据TableRenderPolicy.Helper.renderRow(table.getRow(startRow+i), templateGksxRow);}GksxRowData firstRowData = problemList.get(0);// 合并单元格if(firstRowData.getTypeOneSize() > 1){TableTools.mergeCellsVertically(table, 0, startRow, startRow+firstRowData.getTypeOneSize()-1);}if(firstRowData.getTypeTwoSize() > 1){TableTools.mergeCellsVertically(table, 0, startRow+firstRowData.getTypeOneSize(), startRow+firstRowData.getTypeOneSize()+firstRowData.getTypeTwoSize()-1);}TableTools.mergeCellsHorizonal(table, startRow+firstRowData.getTypeOneSize()+firstRowData.getTypeTwoSize(), 0, 2);}private Style getStyle(){final Style style = new Style();style.setFontFamily("FangSong");style.setFontSize(12);style.setBold(false);return style;}
}

测试方法:

    String filePath = "E:\\Documents\\CompanyProjects\\cxhl-services\\src\\test\\java\\word\\template\\gksx_problem.docx";String targetPath =  "C:\\Users\\Desktop\\output_gksx_problem.docx";// 初始化数据GksxRowData problem1 = new GksxRowData();problem1.setProblemTypeDesc("集团巡视审计专项检查");problem1.setNum("1");problem1.setProblemContent("测试问题描述1");problem1.setProblemScore(BigDecimal.ONE);problem1.setTypeOneSize(4);problem1.setTypeTwoSize(2);GksxRowData problem2 = new GksxRowData();problem2.setProblemTypeDesc("集团巡视审计专项检查");problem2.setNum("2");problem2.setProblemContent("测试问题描述2");problem2.setProblemScore(BigDecimal.ONE);problem2.setTypeOneSize(1);problem2.setTypeTwoSize(1);GksxRowData problem3 = new GksxRowData();problem3.setProblemTypeDesc("集团巡视审计专项检查");problem3.setNum("3");problem3.setProblemContent("测试问题描述3");problem3.setProblemScore(BigDecimal.ONE);GksxRowData problem4 = new GksxRowData();problem4.setProblemTypeDesc("集团巡视审计专项检查");problem4.setNum("4");problem4.setProblemContent("测试问题描述4");problem4.setProblemScore(BigDecimal.ONE);GksxRowData problem5 = new GksxRowData();problem5.setProblemTypeDesc("集团研发专项检查");problem5.setNum("5");problem5.setProblemContent("测试问题描述5");problem5.setProblemScore(BigDecimal.ONE);GksxRowData problem6 = new GksxRowData();problem6.setProblemTypeDesc("集团研发专项检查");problem6.setNum("6");problem6.setProblemContent("测试问题描述6");problem6.setProblemScore(BigDecimal.ONE);GksxRowData problem7 = new GksxRowData();problem7.setProblemTypeDesc("合计");//problem7.setNum("合计");problem7.setProblemContent("合计");problem7.setProblemScore(BigDecimal.valueOf(8.8));List<GksxRowData> problemList = Arrays.asList(problem1, problem2, problem3,problem4,problem5, problem6, problem7);GksxTableData gksxTableData = new GksxTableData();gksxTableData.setGksxRowDataList(problemList);JxWordExport jxWordExport = new JxWordExport();jxWordExport.setGksxTable(gksxTableData);//HashMap<String,Object> hashMap = new HashMap<>();//hashMap.put("gksxTable",gksxTableData);// 开始渲染Configure config = Configure.builder().bind("gksxTable", new TemplateGksxTablePolicy()).build();XWPFTemplate template = XWPFTemplate.compile(filePath, config).render(jxWordExport);//XWPFTemplate template = XWPFTemplate.compile(filePath, config).render(hashMap);template.writeToFile(targetPath);

生成效果如下:
在这里插入图片描述

注意点

  • 1、上面例子中,实体类GksxTableData对应整个表格数据,里面也可以有多个list,且render方法只会处理里面的list属性。
@Data
public class GksxTableData {/*** 待渲染的数据 (扣分详细+合计)*/private List<GksxRowData> gksxRowDataList;private List<GksxRowData> testList;}

在这里插入图片描述
testList也可以接收到,官方文档中的收费单案例就是这样实现的。

  • 2、JxWordExport(也可以不用实体类,使用HashMap替代)中的表格属性名必须和模板中的属性值相同。若行数据实体类属性添加@Name注解,则取注解的名字。

  • 3、1.10.X版本中,RowRenderData获取不到文本数据了。
    可以参考上面的案例,根据实际数据生成RowRenderData,这样代码扩展性也更强。

  • 4、表格行从head头开始算,头为0

    // 表格行从head头开始算,头为0
    table.insertNewTableRow(startRow);
    

官方文档、poi-tl导出word复杂表格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式&#xff0c;它们可以直接访问同一块内存区域&#xff0c;因此比使用管道或消息队列等通信机制更高效。在多进程程序中&#xff0c;共享内存通常与信号量一起使用&#xff0c;以确保对共享内存的访问是线程安全的。 一、打开/创建…

07_for循环返回值while循环

文章目录 1.循环返回值2.yield接收for返回值3.scala调用yield方法创建线程对象4.scala中的while循环5.scala中的流程控制 1.循环返回值 for循环返回值是Unit 原因是防止产生歧义&#xff1b; 2.yield接收for返回值 // 2.yield关键字打破循环&#xff0c;可以使for循环输出…

webpack面试题(持续汇总ing。。。)

webpack的编译过程 初始化 此阶段&#xff0c;webpack会将CLI参数、配置文件、默认配置进行融合&#xff0c;形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备目前&#xff0c;…

LLaMA 3:大模型之战的新序幕

作者 | 符尧 OneFlow编译 翻译&#xff5c;杨婷、宛子琳、张雪聃 本文要点概览&#xff1a; 文本数据的扩展可能已经达到了极限&#xff0c;因为易于获取的网络文本资源&#xff08;如Common Crawl、GitHub、ArXiv等&#xff09;已基本被充分利用。 尽管如此&#xff0c;通过更…

数据结构 - C/C++ - 数组

目录 结构特性 内存布局 结构样式 结构拓展 数据初始 元素访问 插入元素 删除元素 查找元素 修改元素 结构设计 成员变量 构造函数 功能函数 示例代码 结构特性 长度固定&#xff1a;数组的长度在创建时已经被确定&#xff0c;如果需要动态改变数组的长度&#…

C++面向对象程序设计 - 多继承,以及基类与派生类转换

单继承是一个类是从另一个基类派生类而来的&#xff0c;多继承则是一个派生类是同两个或多个基类&#xff0c;派生类从两人或多个基类中继承所需的属性。 声明多重继承的方法&#xff1a; class D: public A, private B, protected C { 类D新增加的成员 } 一、多重继承派生类的…

Vue---组件

Vue—组件 目录 Vue---组件定义组件全局组件局部组件 组件通讯***重点***父子通信之父传子&#xff08;props&#xff09;父子通信之子传父&#xff08;$emit&#xff09;ref属性&#xff08;$refs&#xff09; 动态组件插槽命名插槽 定义组件 全局组件 vue2中template只能传…

浏览器渲染机制:重排(Reflow)与重绘(Repaint)以及Vue优化策略

浏览器渲染机制是一个复杂但有序的过程&#xff0c;其目的是将HTML、CSS和JavaScript代码转化为用户可以看到和交互的视觉界面。重排&#xff08;Reflow&#xff09;与重绘&#xff08;Repaint&#xff09;是浏览器渲染过程中对页面元素进行更新的两个重要步骤&#xff0c;理解…

ubuntu22.04安装TensorRT(过程记录)

重要说明&#xff1a;此贴经过多次修改。第一次安装的的为trt8.6.1版本。第二次安装的10.0.0.6版本。有些地方可能没改过来&#xff0c;比如链接向导&#xff0c;我懒得改了&#xff0c;但是流程是对的。 cuda和cudnn版本对应关系 tensorRT历史发行版本 CUDA历史发行版本 cudn…

ENVI不同版本个人使用对比

ENVI不同版本个人使用对比 文章目录 ENVI不同版本个人使用对比前言对比5.3学习版5.6学习版6.0试用版 总结 前言 目前来看&#xff0c;流传较广的可供大家免费获取的ENVI版本主要是5.3学习版 5.6学习版 6.0学习版这三个版本&#xff0c;不同的版本有不同特色&#xff0c;在此做…

C#基础|StringBuilder字符串如何高效处理。

哈喽&#xff0c;你好&#xff0c;我是雷工。 字符串处理在C#程序开发中是使用频率比较高的&#xff0c;但常规的字符串处理方式对内存占用比较多&#xff0c;为了优化内存&#xff0c;减少不必要的内存浪费&#xff0c;引入了StringBuilder类。 下面学习下StringBuilder类的使…

PC-3000 Flash:NAND 闪存设备(包括一体式U盘)数据恢复的重量级工具(一)

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含 PC-3000 系列数…

LeetCode 热题 100 Day05

矩阵相关题型 Leetcode 73. 矩阵置零【中等】 题意理解&#xff1a; 将矩阵中0所在位置&#xff0c;行|列置换为全0 其中可以通过记录0元素所在的行、列号&#xff0c;来标记要置换的行|列 将对应位置置换为0 解题思路&#xff1a; 第一个思路&#xff1a; 可以…

React | classnames

classnames 这个库在我们的项目中有大量的使用到&#xff0c;它不仅很实用&#xff0c;还非常好用&#xff0c;但还有人不知道这个库&#xff0c;我真的是十分心痛。 通过 classnames&#xff0c;我们可以给组件设置多个 className&#xff0c;还可以根据需要动态设置 classNa…

模块四:前缀和——DP35 【模板】二维前缀和

文章目录 题目描述算法原理解法一&#xff1a;暴力模拟&#xff08;时间复杂度为O(n*m*q)&#xff09;解法二&#xff1a;二维前缀和&#xff08;时间复杂度为O(m*n)O(q)) 代码实现解法二&#xff1a;前缀和&#xff08;C)Java 题目描述 题目链接&#xff1a;DP35 【模板】二维…

三星电脑文件夹误删了怎么办?恢复方案在此

在使用三星电脑的过程中&#xff0c;我们可能会不小心删除了某个重要的文件夹&#xff0c;其中可能包含了工作文件、家庭照片、视频或其他珍贵的数据。面对这种突发情况&#xff0c;不必过于焦虑。本文将为您提供几种有效的恢复方案&#xff0c;希望能帮助您找回误删的文件夹及…

openEuler-22.03安装 mysql8.0.32

一、下载解压 下载地址&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) tar -xvf mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql-8.0.32 二、安装 最开始安装一直报错 缺少 libcrypto.so.10库文件,安装openssl可以解决 wget http://…

Java客户端如何直接调用es的API

Java客户端如何直接调用es的API 一. 问题二. withJson 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 问题 今天做项目的时候&#xff0c;想要直接通过java客户端调用es的api…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代&#xff0c;数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中&#xff0c;数据作为一种客观存在的资源&#xff0c;所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

【万字长文】看完这篇yolov4详解,那算是真会了

前言 目标检测作为计算机视觉领域的一个核心任务&#xff0c;其目的是识别出图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。YOLO&#xff08;You Only Look Once&#xff09;系列模型因其检测速度快、性能优异而成为该领域的明星。随着YOLOv4的推出&#xff0c;…