SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格

embedded/2024/12/25 20:13:49/
htmledit_views">

需求背景

项目开发过程中 有需要生成html" title=pdf>pdf的需求  这种需求内可能会存在使用表格去展示一些数据给用户  使其更明显直观的对比数据  这时候会存在一个项目或者仪器对应了多个单子  这就用到了table的td合并

样例展示

类似例子中html" title=pdf>pdf生成出来的图表  第一个项目有多个批号  这时候需要将项目的单元格td进行rowspan合并  但是因为这个对应的批号是动态的  类似第二个项目就只对应出来一条

实现过程

html"><table><thead><tr><th>测定</th><th colspan="6">绘制质控图的均值和标准差</th><th colspan="6">当月原始测定结果</th><th colspan="3">除失控后的测定结果</th><th colspan="5">累计测定结果</th><th colspan="2">质量目标</th></tr><tr><!-- 测定 --><th>项目</th><!-- 绘制质控图的均值和标准差 --><th>批号/效期</th><th>单位</th><th>水平</th><th>均值</th><th>SD</th><th>CV%</th><!-- 当月原始测定结果 --><th>均值</th><th>SD</th><th>CV%</th><th>N</th><th>失控数</th><th>在控率%</th><!-- 除失控后的测定结果 --><th>均值</th><th>SD</th><th>CV%</th><!-- 累计测定结果 --><th>均值</th><th>SD</th><th>CV%</th><th>N</th><th>%</th><!-- 质量目标 --><th>CV</th><th>SD</th></tr></thead><tbody><tr th:each="item : ${reportBody}"><th:block th:if="${!#strings.isEmpty(item.customerReportItemName)}"><td th:text="${item.customerReportItemName}" th:rowspan="${item.rowspan}"></td></th:block><td th:text="${item.qcBatchId}"></td><td th:text="${item.drawQcPictureUnit}"></td><td th:text="${item.drawQcPictureLevel}"></td><td th:text="${item.drawQcPictureAverageValue}"></td><td th:text="${item.drawQcPictureSdValue}"></td><td th:text="${item.drawQcPictureCvValue}"></td><td th:text="${item.currentMonthOriginAverageValue}"></td><td th:text="${item.currentMonthOriginSdValue}"></td><td th:text="${item.currentMonthOriginCvValue}"></td><td th:text="${item.currentMonthOriginCount}"></td><td th:text="${item.currentMonthOriginOutControlCount}"></td><td th:text="${item.currentMonthOriginInControlCountPercent}"></td><td th:text="${item.currentMonthWithOutControlAverageValue}"></td><td th:text="${item.currentMonthWithOutControlSdValue}"></td><td th:text="${item.currentMonthWithOutControlCvValue}"></td><td th:text="${item.currentYearAverageValue}"></td><td th:text="${item.currentYearSdValue}"></td><td th:text="${item.currentYearCvValue}"></td><td th:text="${item.currentYearCount}"></td><td th:text="${item.currentYearInControlPercent}"></td><td th:text="${item.targetCvValue}"></td><td th:text="${item.targetSdValue}"></td></tr></tbody></table>

因为Thymeleaf内并不支持写js或者Java的逻辑   因为这部分是直接后端将数据对接到Thymeleaf 不经过前端   所以将逻辑放入后端去进行  在数据格式更改一个字段逻辑及加入一个字段去支持渲染(customerReportItemName、rowspan)

若项目内有多个批号  则在第一个批号对象内将customerReportItemName项目名称进行返回  rowspan是需要合并td的数量  若3个批号  这里则返回3  后面的批号内则不返回项目名称 这时候代码中if生效 会少进行生成一个td  若不进行判断的话单条行会多出一个空白td

html">//第一个项目的数据结构案例
[{customerReportItemCode: "zhikongtest",customerReportItemId: "1856580801022141383",customerReportItemName: "王质控-定量",rowspan: "3",currentMonthOriginAverageValue: "100.000",currentMonthOriginCount: 1,currentMonthOriginCvValue: "0.000",currentMonthOriginInControlCountPercent: "0.0",currentMonthOriginOutControlCount: 0,currentMonthOriginSdValue: "0.000",currentMonthWithOutControlAverageValue: "100.000",currentMonthWithOutControlCvValue: "0.000",currentMonthWithOutControlSdValue: "0.000",currentYearAverageValue: "100.000",currentYearCount: 1,currentYearCvValue: "0.000",currentYearSdValue: "0.000",drawQcPictureAverageValue: "12.12",drawQcPictureCvValue: "191.666",drawQcPictureLevel: "H",drawQcPictureSdValue: "23.23",qcBatchId: "王质控-定量-001",targetSdValue: "123.123",},{customerReportItemCode: "zhikongtest",customerReportItemId: "1856580801022141383",customerReportItemName: "",rowspan: "0",currentMonthOriginAverageValue: "100.000",currentMonthOriginCount: 1,currentMonthOriginCvValue: "0.000",currentMonthOriginInControlCountPercent: "0.0",currentMonthOriginOutControlCount: 0,currentMonthOriginSdValue: "0.000",currentMonthWithOutControlAverageValue: "100.000",currentMonthWithOutControlCvValue: "0.000",currentMonthWithOutControlSdValue: "0.000",currentYearAverageValue: "100.000",currentYearCount: 1,currentYearCvValue: "0.000",currentYearSdValue: "0.000",drawQcPictureAverageValue: "100.000",drawQcPictureCvValue: "0.000",drawQcPictureLevel: "H",drawQcPictureSdValue: "0.000",qcBatchId: "王质控-定量-003",targetSdValue: "123.123",},{customerReportItemCode: "zhikongtest",customerReportItemId: "1856580801022141383",customerReportItemName: "",rowspan: "0",currentMonthOriginAverageValue: "80.000",currentMonthOriginCount: 1,currentMonthOriginCvValue: "0.000",currentMonthOriginInControlCountPercent: "0.0",currentMonthOriginOutControlCount: 0,currentMonthOriginSdValue: "0.000",currentMonthWithOutControlAverageValue: "80.000",currentMonthWithOutControlCvValue: "0.000",currentMonthWithOutControlSdValue: "0.000",currentYearAverageValue: "80.000",currentYearCount: 1,currentYearCvValue: "0.000",currentYearSdValue: "0.000",drawQcPictureAverageValue: "80.000",drawQcPictureCvValue: "0.000",drawQcPictureLevel: "M",drawQcPictureSdValue: "0.000",qcBatchId: "王质控-定量-003",targetSdValue: "123.123",},{customerReportItemCode: "zhikongtest",customerReportItemId: "1856580801022141383",customerReportItemName: "",rowspan: "0",currentMonthOriginAverageValue: "87.500",currentMonthOriginCount: 2,currentMonthOriginCvValue: "14.286",currentMonthOriginInControlCountPercent: "0.0",currentMonthOriginOutControlCount: 0,currentMonthOriginSdValue: "12.500",currentMonthWithOutControlAverageValue: "87.500",currentMonthWithOutControlCvValue: "14.286",currentMonthWithOutControlSdValue: "12.500",currentYearAverageValue: "87.500",currentYearCount: 2,currentYearCvValue: "14.286",currentYearSdValue: "12.500",drawQcPictureAverageValue: "12.12",drawQcPictureCvValue: "191.666",drawQcPictureLevel: "L",drawQcPictureSdValue: "23.23",qcBatchId: "王质控-定量-001",targetSdValue: "123.123",},{customerReportItemCode: "zhikongtest",customerReportItemId: "1856580801022141383",customerReportItemName: "",rowspan: "0",currentMonthOriginAverageValue: "80.000",currentMonthOriginCount: 1,currentMonthOriginCvValue: "0.000",currentMonthOriginInControlCountPercent: "0.0",currentMonthOriginOutControlCount: 0,currentMonthOriginSdValue: "0.000",currentMonthWithOutControlAverageValue: "80.000",currentMonthWithOutControlCvValue: "0.000",currentMonthWithOutControlSdValue: "0.000",currentYearAverageValue: "80.000",currentYearCount: 1,currentYearCvValue: "0.000",currentYearSdValue: "0.000",drawQcPictureAverageValue: "80.000",drawQcPictureCvValue: "0.000",drawQcPictureLevel: "M",drawQcPictureSdValue: "0.000",qcBatchId: "王质控-定量-002",targetSdValue: "123.123",},];


http://www.ppmy.cn/embedded/148259.html

相关文章

JAVA服务器端发送邮件问题 Could not connect to SMTP host

写在前面 在开发过程中&#xff0c;发送邮件经过本地测试是没有问题&#xff0c;部署到服务器上后&#xff0c;发送邮件一直报 Could not connect to SMTP host : smtp.yeah.net, port: 465 解决方法 网上各种解决方案&#xff0c;都试了一遍都未能解决这个报错问题&#xf…

三相电原理

首先从一个交流发电机看 下图为电机内部的横截面图。中间为永磁体转子 我们拿一根铜线&#xff0c;如图所示绕成两个线圈&#xff0c;形成闭合回路 接下来让中心永磁体转动。线圈内部的自由电子受到磁场变化的干扰产生感应电流。 磁场线的分布是一个双椭圆。由于磁场线越密集的…

谷歌集群数据集:负载均衡云服务测试数据

谷歌集群数据集 以下为你举例说明各文件中一条数据的具体含义,方便你更好地理解这个数据集: 1. machine_events 文件示例 假设其中有这样一条数据:123456789, 101, 0, "platform_abc", 4, 8 含义:表示在时间戳为123456789微秒时,机器ID为101的这台机器发生了…

smb和nfs双栈协议共享目录

1 简介 NFS和SAMBA协议都是文件共享&#xff0c;Linux客户端常用于NFS协议访问远程共享目录&#xff0c;Windows客户端常用于SAMBA协议访问远程共享目录。 2 环境 合计使用三台服务器&#xff0c;服务器都位于同一个子网&#xff08;10.0.0.0/19&#xff09;、同一个安全组…

CSS系列(24)-- 打印样式详解

前端技术探索系列&#xff1a;CSS 打印样式详解 &#x1f5a8;️ 致读者&#xff1a;探索打印样式的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 打印样式&#xff0c;学习如何优化网页的打印体验。 打印样式基础 &#x1f680; 媒体查询 /* 打…

项目30:简易连连看游戏 --- 《跟着小王学Python·新手》

项目30&#xff1a;简易连连看游戏 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Py…

Linux -- 线程控制相关的函数

目录 pthread_create -- 创建线程 参数 返回值 代码 -- 不传 args&#xff1a; 编译时带 -lpthread 运行结果 为什么输出混杂&#xff1f; 如何证明两个线程属于同一个进程&#xff1f; 如何证明是两个执行流&#xff1f; 什么是LWP&#xff1f; 代码 -- 传 args&a…

TypeScript与JavaScript的区别

本文我们要聊一聊 TypeScript 和 JavaScript 之间的区别。可能我们已经注意到&#xff0c;TypeScript 是 JavaScript 的超集&#xff0c;那么它到底比 JavaScript 多了些什么&#xff1f;为什么我们要选择 TypeScript&#xff0c;而不仅仅是写普通的 JavaScript 呢&#xff1f;…