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 {

	@Override
	public 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复杂表格

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

结构体枚举、联合、位段

枚举 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举。 月份有12个月&#xff0c;也可以一一列举 这里就可以使…

Shader for Quest 2: 自定义shader在Unity Editor中可以使用,但是在Quest 2中却不可以

GameObject segment GameObject.Find("DisplayArea_" i); MeshRenderer renderer segment.GetComponent<MeshRenderer>(); Material mat new Material(Shader.Find("Custom/MyShader")); mat.mainTexture option.Image360;上面这份代码&#x…

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 引入外部css/js代码编辑器的使用Handler 方法使用介绍Style 用法示例LifeCycle 生命周期介绍 数据模型方…

【1471】java项目进度管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目进度管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

测试必备 | 测试工程师必知的Linux命令有哪些?

在日常的测试工作中&#xff0c;涉及到测试环境搭建及通过查看日志来定位相关问题时经常会用到Linux&#xff0c;在测试工程师的面试中也经常会有笔试或面试的题目来考查测试人员对Linux的熟悉程度&#xff0c;这里分享下测试工程师需知的 Linux 命令有哪些。 Linux 作为一种常…

【 书生·浦语大模型实战营】作业(四):XTuner 微调 LLM:1.8B、多模态、Agent

【 书生浦语大模型实战营】作业&#xff08;五&#xff09;&#xff1a;LMDeploy 量化部署 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…

模块四:前缀和——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;轻量的、重量的都有。 从开发者的角度&#xff0c;自然把轻量作为第一选择&#xff0c;因为好对接&#xff0c;怎么方便怎么来…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(六)

目录 第六章 系统测试 6.1 功能性测试 6.1.1 商家后台功能测试 6.1.2 前台功能测试 6.2 非功能性测试 6.3 本章小结 结束语 参考文献 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;五&#xff09; 相关免费源码资源 乐优商城…

2024年【制冷与空调设备运行操作】最新解析及制冷与空调设备运行操作免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作最新解析是安全生产模拟考试一点通生成的&#xff0c;制冷与空调设备运行操作证模拟考试题库是根据制冷与空调设备运行操作最新版教材汇编出制冷与空调设备运行操作仿真模拟考试。2024年【制冷…

不只有 Spring,这四款Java 基础开发框架同样值得关注!

Java 开发不只有 Spring &#xff0c;今天给大家推荐几个同样优秀的 Java 基础开发框架&#xff0c;为日常项目开发提供更多的选择。答应我&#xff0c;请不要再叫我 Spring 小子了&#xff0c;​好吗&#xff1f; 项目概览&#xff1a; Guice&#xff1a;轻量级依赖注入框架 …

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

Intelij Idea Push失败,出现git Authentication failed(验证失败)

目录 1、出现问题的原因 2、解决之法 1、出现问题的原因 能出现这种问题&#xff0c;最主要的原因是链接对上了&#xff0c;但用户验证失败了&#xff0c;即登录失败。 因为服务器转移或者换了git项目链接&#xff0c;导致你忘记了用户名密码&#xff0c;随意输入之后&…

P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量

这节课主要是怎么对Attribute进行在进行到游戏角色前先进行处理,以及游戏效果如何回调 AuraAttributeSet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "AttributeSet.h&…

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了&#xff0c;提示“此站点遇到了致命错误”,如图&#xff1a; 这个网站一直都是正常运行的&#xff0c;最近也没有过什么更新&#xff0c;按理说不应该会出现问题&#xff0c;我担心可能是主机方面做了什么调整导致&#xff0c;所以联系了Ho…

品鉴中的个人偏好:如何找到适合自己的红酒风格

品鉴红酒时&#xff0c;个人偏好起着至关重要的作用。不同的人对红酒的风格、口感和特点有着不同的喜好和需求。对于云仓酒庄雷盛红酒而言&#xff0c;如何找到适合自己的红酒风格&#xff0c;是品鉴过程中需要关注的问题。 首先&#xff0c;了解自己的口味和喜好是找到适合自己…

spi接口的基本概念、引脚定义及注意事项

目录 基本概念 引脚定义 注意事项 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行接口技术&#xff0c;广泛应用于微控制器和各种外围设备之间的短距离通信。 基本概念 SPI接口允许微控制器以串行方式与一个或多个外围设备进行通信。它是一种高速、…

B端:销售投入远超研发投入,想让B端漂亮体验好,非常难。

足够的研发费用是确保B端系统研发体验好、品质佳的重要条件之一。在B端系统研发过程中&#xff0c;足够的研发费用可以用于以下方面&#xff1a; 1.人才投入&#xff1a; 招聘高素质的研发团队成员&#xff0c;包括开发工程师、测试工程师、产品设计师、运维工程师等&#xf…

【进程通信】利用管道创建进程池(结合代码)

文章目录 什么叫进程池进程池的优点 创建进程池代码实现&#xff1a; 什么叫进程池 我们知道&#xff0c;一个进程创建子进程通常是为了让这个子进程去为它完成某个任务。例如我们使用的指令&#xff0c;其实就是bash进程创建子进程让子进程去执行的。但是我们需要考虑这样一个…

RLDP协议原理与应用

RLDP概述 l RLDP全称是Rapid Link Detection Protocol&#xff08;快速链路检测协议&#xff09;&#xff0c;是锐捷网络自主开发的&#xff0c;用于快速检测以太网链路故障的链路协议。 l 一般的以太网链路检测机制都只是利用物理连接的状态&#xff0c;通过物理层的自动协…