【Excel PDF 系列】EasyExcel + iText 库实现 Excel 转换 PDF

你知道的越多,你不知道的越多
点赞再看,养成习惯
如果您有疑问或者见解,欢迎指教:
企鹅:869192208

文章目录

        • 前言
        • 转换前后效果
        • 引入 pom 配置
        • 代码实现
            • 定义 ExcelDataVo 对象
            • 主方法
            • EasyExcel 监听器

前言

最近遇到生成 Excel 并转 PDF 的需求,磕磕碰碰总结三种方式,分别是 POI + iText 库,EasyExcel + iText 库和直接生成 PDF 表格三种方式。

本文基于 EasyExcel + iText 库实现,并将自定义 PDF 上 title 内容,将生成的 PDF 文件返回。

转换前后效果

转换前
转换后

引入 pom 配置
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.3.2</version><scope>compile</scope>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
代码实现
定义 ExcelDataVo 对象
@Data
public class ExcelDataVo implements Serializable {private static final long serialVersionUID = 1L;/**生成pdf的文件路径*/private String pdfFilePath;/**生成pdf的文件标题*/private String title;
}
主方法
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class ExcelConvertService {public static void main(String[] args) throws Exception {// 需要进行转换的excelString fileName = "D:\\\\对账明细报告.xlsx";// 重点:通过创建监听器并且将当前创建的对象传递进去ExcelDataVo excelDataVo = new ExcelDataVo();excelDataVo.setTitle("对账明细报告");EasyExcel.read(fileName, new NoModelDataListener(excelDataVo)).sheet().doRead();log.info("读取完成:{}", JSON.toJSONString(excelDataVo));}
EasyExcel 监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.util.ConverterUtils;
import com.itextpdf.text.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.extern.slf4j.Slf4j;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {// 存储读取到 excel 的每一行private List<Map<Integer, String>> cachedDataList = new ArrayList<>();// 存储读取到 excel 的列头private Map<Integer, String> cachedHead = new HashMap<>();//自定义返回结果类,也就是与传递给controller的实体类ExcelDataVo excelDataVo;//重点:通过构造器把 excelDataVo 对象传递过来public NoModelDataListener(ExcelDataVo excelDataVo) {this.excelDataVo = excelDataVo;}@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {cachedDataList.add(data);}@Overridepublic void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {cachedHead = ConverterUtils.convertToStringMap(headMap, context);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {String pdfFilePath = "D:\\对账明细报告.pdf";try (FileOutputStream fos = new FileOutputStream(pdfFilePath)) {// 创建PDF文档对象Document document = new Document(PageSize.A2, 50, 50, 50, 50);// 创建PDF输出流PdfWriter writer = PdfWriter.getInstance(document, fos);// 打开PDF文档document.open();// 创建PDF表格对象PdfPTable table = new PdfPTable(cachedDataList.get(0).size());table.setHeaderRows(1);//table.setWidths(new float[] {1, 2, 2, 2});// 设置表格宽度table.setWidthPercentage(100);// 设置表格标题//String sheetName = context.readSheetHolder().getSheetName();String sheetName = excelDataVo.getTitle();Paragraph title = new Paragraph(sheetName, new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 16, Font.BOLD));title.setAlignment(Element.ALIGN_CENTER);document.add(title);// 添加表格标题for (Map.Entry<Integer, String> entry : cachedHead.entrySet()) {String value = entry.getValue();PdfPCell pdfCell = new PdfPCell(new Paragraph(value, new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 12)));pdfCell.setBorderWidth(1f);pdfCell.setBorderColor(BaseColor.BLACK);pdfCell.setPadding(5f);pdfCell.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(pdfCell);}// 添加表格内容for (Map<Integer, String> map : cachedDataList) {for (Map.Entry<Integer, String> entry : map.entrySet()) {PdfPCell pdfCell = new PdfPCell(new Paragraph(entry.getValue()));pdfCell.setBorderWidth(1f);pdfCell.setBorderColor(BaseColor.BLACK);pdfCell.setPadding(5f);table.addCell(pdfCell);}}// 添加表格到PDF文档table.setSpacingBefore(20f);table.setSpacingAfter(20f);table.setKeepTogether(true);document.add(table);// 关闭PDF文档document.close();} catch (IOException | DocumentException e) {e.printStackTrace();}excelDataVo.setPdfFilePath(pdfFilePath);log.info("所有数据解析完成!");}
}

至此,就基于 EasyExcel 和 iText 库实现了 Excel 转 PDF 的逻辑,并将外部的数据传递到监听器,也从监听器拿到返回的内容,其他的比如 Service 传递到监听器也可以通过这种注入方式实现。

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

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

相关文章

图论 - 最小生成树(Prime、Kruskal)

文章目录 前言Part 1&#xff1a;Prim算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;Kruskal算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客介绍两种求最小生成树的方法&#xff…

辽宁博学优晨教育视频:引领安全可靠的学习新风尚

在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;线上教育已成为越来越多人提升自我、拓宽视野的重要选择。辽宁博学优晨教育视频凭借其安全可靠的特质&#xff0c;在众多在线教育平台中脱颖而出&#xff0c;成为广大学子信赖的学习伙伴。 一、辽宁博学优晨教育视频…

MagiskHideProps 使用 props 开启 android 手机的 ro.debuggable =1 的方法

因为 CDSN 一直不给对旧的文章&#xff08;特别是边幅比较长的文章&#xff09;一直都无法修改&#xff0c;保存&#xff0c;重新发布 一直都是操作超时 我这里是补全 这边文章中 unity shader - 圣斗士星矢 人物 shader 还原 - GPA 抓帧提取资源、shader&#xff0c;ROOT权…

python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾

现在越来越多的网站已经能够通过JA3或者其他指纹信息&#xff0c;来识别你是不是爬虫了。传统的方式比如换UA&#xff0c;加代理是没有任何意义了&#xff0c;所以这个时候我们就需要使用到curl_cffi 了。 1.TLS 指纹是啥&#xff1f; 在绝大多数的网站都已经使用了 HTTPS&am…

构造pop链

反序列化视频笔记 第一步&#xff1a;找到目标触发echo调用$flag 第二步&#xff1a;触发_invoke函数调用appeng函数$varflag.php&#xff08;把对象当成函数&#xff09; 第三步&#xff1a;给$p赋值为对象&#xff0c;即function成为对象Modifier却被当成函数调用&#xff…

加密与安全_探索口令加密算法(PBE)

文章目录 概述疑问PBE 算法 &#xff08; Password Based Encryption&#xff09;CodePOM实现 小结 概述 加密与安全_探索对称加密算法中我们提到AES加密密钥长度是固定的128/192/256位&#xff0c;而不是我们用WinZip/WinRAR那样&#xff0c;随便输入几位都可以。 这是因为对…

2024最新算法:斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)求解23个基准函数

一、斑翠鸟优化算法 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵感。PKO 算法围绕三个不…

MySQL数据库引擎,以及常用引擎的区别

先看图&#xff1a; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE MYISAM&#xff1a; 全表锁&#xff0c;拥有较高的执行速度&#xff0c;不支持事务&#xff0c;不支持外键&#xff0c;并发性能差&#xff0c;占用空间相对较小&#xff0c;对事务完整性没有…

SpringBoot整合rabbitmq-主题交换机队列(四)

说明&#xff1a;Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定&#xff0c;这个绑定的Routingkey是包含通配符的&#xff0c;满足通配符的队列会接收到消息。 通配符规则&#xff1a; #&#xff1a;匹配一个或多个词 *&#xff1a;匹配一个词 例如&#xff…

2024洗地机深度测评推荐,洗地机哪款值得入手?新手入门必看洗地机选购技巧

洗地机是近年来备受瞩目的智能家居产品&#xff0c;它能够有效地帮助我们节省劳动时间&#xff0c;高效清洁地面&#xff0c;从而减轻我们的劳动负担。洗地机实现了扫地和拖地的一体化功能&#xff0c;在扫地的同时还能顺便完成地面的拖洗工作。配备水箱的设计使得不再需要频繁…

【kubernetes VPA】记录一次安装 VPA 相关组件的报错解决过程

文章目录 1. 问题描述2. 问题原因3. 解决办法4. 参考链接 1. 问题描述 在执行 ./hack/vpa-up.sh脚本命令时&#xff0c;提示有报错。名为vpa-admission-controller的容器状态一直停留在ContainerCreating&#xff0c;从该Pod详细描述中得知&#xff0c;volume "tls-certs…

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM&#xff0c;容量为1024/8128k bytes。它的引脚如下&#xff1a; 其中A1,A2为硬件地址引脚 WP为写保护引脚&#xff0c;一般我们需要读写&#xff0c;需要接低电平GND&#xff0c;接高的话则仅允许读 SDA和SCL则为IIC通信引脚 芯片通信采用IIC&…

02、MongoDB -- MongoDB 的安全配置(创建用户、设置用户权限、启动安全控制、操作数据库命令演示、mongodb 的帮助系统介绍)

目录 MongoDB 的安全配置演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 的安全配置启动演示用到的 mongodb 服务器 和 客户端启动单机模式的 mongodb 服务器&#xff1a;启动 mongodb 的…

【数据结构】19 平衡二叉树

定义 平衡二叉树又称为AVL树&#xff0c;是具有以下性质的非空搜索树&#xff1a; 任一结点的左、右子树均为AVL树。根节点的左、右子树高度差的绝对值不超过1. 对于二叉树的任一结点T&#xff0c;其平衡因子&#xff08;BF&#xff09;定义为BF(T) h L − h R h_L- h_R hL…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

使用GPTQ进行4位LLM量化

使用GPTQ进行4位LLM量化 最佳脑量化GPTQ算法步骤1:任意顺序洞察步骤2:延迟批量更新第三步:乔尔斯基重塑 用AutoGPTQ量化LLM结论References 权重量化的最新进展使我们能够在消费级硬件上运行大量大型语言模型&#xff0c;例如在RTX 3090 GPU上运行LLaMA-30B模型。这要归功于性能…

信息收集2.0版本

内网渗透之信息收集 whois查询 1.1.1.1. 在线网站查询 输入相关的域名即可进行查询。 &#xff08;1&#xff09;站长之家&#xff1a;whois域名查询&#xff1a;http://whois.chinaz.com/ &#xff08;2&#xff09;爱站工具网&#xff1a;whois域名查询&#xff1a;站长…

mysql数据库操作小寄巧

目录 json字段查询时间相关只有日期只有时间又有时间又有日期时间比较时间运算 某字段同的取最新数据&#xff08;软性的新数据覆盖旧数据查找&#xff09;sql_modeonly_full_group_by的解决办法优化思路 json字段查询 查询某个json字段&#xff08;xx&#xff09;的某个属性下…

【考研数学】零基础备考全年计划

25考研数学基础差&#xff0c;一定要重视基础的复习&#xff01; 基础不牢&#xff0c;地动山摇&#xff0c;这句话在如今的考研更加贴切 24考研的新形势&#xff1a; 重基础、计算量大、反押题 每一个变化对于基础差的同学都不是好消息。 做过近几年考研真题的人都会发现…