Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)

简介: Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)

昨天写了篇较为粗糙的文章,👉Java 将 Excel 转换为 PDF 文件 完成了 Excel 文件转为 PDF 文件的操作

但实际上那还只是解决了我的后半部分的问题~

我实际遇到的问题:在页面的表格中,选中一行数据,需要执行打印预览(即PDF文件预览)

从一开始我就把一行一行的编辑表格的方式给pass掉了,太麻烦了,也没有办法进行复用。

前言

我在互联网上冲浪的时候,看到有的小伙伴说可以使用Excel模板,来实现这个功能。

这个方式我是喜欢的~ (ps:因为不要用代码去画表格,是真的舒服~)

大致流程如下:

  • 编写一个 Excel 的模板,就相当于先在excel文件中,把表格信息都弄好,以及相关的占位符。
  • 使用 Java 读取这个 Excel 文件,并将数据塞进 Excel 表格中
  • 最后就是将这个 Excel 文件转为PDF文件 (昨天已经实现了)

先说说我使用的相关jar包

 <dependencies>
     <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
     <dependency>
         <groupId>org.apache.pdfbox</groupId>
         <artifactId>pdfbox</artifactId>
         <version>2.0.24</version>
     </dependency>
     <dependency>
         <groupId>net.sf.jxls</groupId>
         <artifactId>jxls-core</artifactId>
         <version>1.0.6</version>
     </dependency>
       <!--这个jar需要看我上一篇文章 -->
     <dependency>
         <groupId>com.aspose</groupId>
         <artifactId>aspose-cells</artifactId>
         <version>8.6.2</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>5.2.3</version>
     </dependency>
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>5.2.3</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml-schemas</artifactId>
         <version>4.1.2</version>
     </dependency>
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <version>1.18.24</version>
         <scope>compile</scope>
     </dependency>
     <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.6.1</version>
     </dependency>
 </dependencies>

这些jar包,虽然我都去找了最新的jar,但不得不说,我现在的解决方式应该不能算是一个好的方式,因为引入的net.sf.jxls相关的jar包已经在 2014 年停止维护了😂。

其他的方式我也还在找,其实不是没有好的方式吧,只能说是免费的不太行。

有好的方式滴我一下,感谢各位大佬们~

编码

excel 模板文件

先看看excel 表格的模板:

image.png

里面的${data.titleBean.date}都是占位符,稍后在程序中,会进行填充。

昨天已经实现了 Excel 表格转换为PDF文件的功能~

文章链接:

今天的任务就是读取这个Excel表格模板,将数组组装好,然后塞进去,再转成PDF文件,就完事啦~ 冲!!!

修改 net.sf.jxls 包下的代码

在开始之前,我们需要改写修改一下net.sf.jxls包下的几个类,否则会一直报错。

比如:net.sf.jxls.transformer包下的CellTransformer

image.png

这个Cell.CELL_TYPE_BLANK在之后的org.apache.poi包中已经被移除了。

所以如果要使用的话,就需要对这些地方做一些覆盖,

  • 可以直接修改源码,再重新打包,
  • 也可以像我这样,直接在项目中建立一个同名的包、类,然后进行修改,实现覆盖的效果。

image.png

代码修改的地方都很简单,但是代码本身的量很大,贴出来太麻烦啦。

说一下覆盖的方法:

  • 首先建立同名的包和类(就是上面的几个类要动,其他的暂时还没发觉)
  • 直接从源码中将代码拷贝进来
  • 针对爆红的地方修改就好了(修改的对应规则在后文)

比如源代码中的几个问题:

image.png


源码中Cell.CELL_TYPE_BLANK、CELL_TYPE_STRING等等对应的值:

CELL_TYPE_NUMERIC 数值 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5

我们将它与之对应修改为:

 public enum CellType {
     @Internal(
         since = "POI 3.15 beta 3"
     )
     _NONE(-1),
     NUMERIC(0),
     STRING(1),
     FORMULA(2),
     BLANK(3),
     BOOLEAN(4),
     ERROR(5);
 }

比如Cell.CELL_TYPE_NUMERIC 就改成CellType.NUMERIC

其他同上~

组装数据 & 测试

测试代码

 /**
  * @description:
  * @author: Ning Zaichun
  * @date: 2022年10月29日 10:32
  */
 public class TestExcelToPdf {
 ​
     public static void main(String[] args) throws IOException, InvalidFormatException {
         List<Map<String, Object>> objects = new ArrayList<>();
         // sheetTitle 几个表的意思 我这里模拟的是照着这个模板打印三个 为了演示这个参数
         int sheetTitle = 1;
         // 将下面的循环中 i<=3 改为 i<=1 ,则打印一遍
         for (int i = 1; i <=1; i++) {
             TitleBean titleBean = new TitleBean("宁在春", new Date(), "掘金", "春春", new Date());
             List< Bill> list = new ArrayList<>();
             for (int j = 1; j <= 3; j++) {
                 list.add(new Bill(""+i,"ningzaichun"+i,"给我点个赞吧~"));
             }
             Map<String, Object> printMap = new LinkedHashMap<>();
             printMap.put("listBean", list);
             printMap.put("titleBean", titleBean);
             printMap.put("sheetTitle", sheetTitle++);
             objects.add(printMap);
         }
         //临时excel路径
         String templatePath = "E:\789.xls";
         InputStream is = new FileInputStream(templatePath);
         List<String> listSheetNames = new ArrayList<>();
         for (Map<String, Object> object : objects) {
             listSheetNames.add(object.get("sheetTitle").toString());
         }
         String targetPath = "D:\ceshi\123.xls";
         XLSTransformer transformer1 = new XLSTransformer();
         Map<String, String> beans = new LinkedHashMap<>();
         Workbook workbook = transformer1.transformMultipleSheetsList(is, objects, listSheetNames, "data", beans, 0);
         workbook.write(new FileOutputStream(targetPath));
         ExcelToPdf.convertPDF(true, targetPath);
     }
 }

补充:如果需要更高的复用性,可以直接使用Map包裹,这样可以直接让这个方法变得通用。(ps:此处是为了更好且更简单的阅读体验而修改)

ExcelToPdf.convertPDF(true, targetPath);是在这昨天的这篇文章中👉Java 将 Excel 转换为 PDF 文件

相关的两个实体类:(excel 模板表格中的所有的字段名都是与实体类中一一对应的)

 @Data
 @AllArgsConstructor
 public class Bill {
     private String  rowNo;
     private String  productName;
     private String  remark;
 }
 ​
 @Data
 @AllArgsConstructor
 public class TitleBean {
 private String  customerName;
     private Date billDate;
     private String  saleArea;
     private String  createUserName;
     private Date createDate;
 }

测试结果:

image.png

我没有做什么输出,只要是正常结束即表示成功。

那个log4j2什么的报错,降之前的引入日志包的版本即可,我看着不影响就没有去降了。

image.png

从结果来看,是可以正常将数据填入,并且实现转换,但一些问题还是存在的~

还存在的问题

目前还存在的问题:

  • 很多样式还没有进行测试,不知道是否都支持
  • 一些样式的调整,表格位于PDF文件的位置需要调整(如边框距,上下边框)
  • 字体的支持等等

反正目前先写到这吧~

后记

今天就写到了这里啦~ 感觉自己还好菜啊~ 一起努力哦~

大家有什么好的方式,也可以推荐推荐,友善交流~

希望你是满载而归的~

周六就这样的度过了,还没有好好感受片刻,就已经消失

目录
相关文章
|
9月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
9月前
|
Python
将Excel特定某列数据删除
将Excel特定某列数据删除
|
9月前
|
Python
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。
|
10月前
|
前端开发
个人征信PDF无痕修改软件,个人征信模板可编辑,个人征信报告p图神器【js+html+css仅供学习用途】
这是一款信用知识学习系统,旨在帮助用户了解征信基本概念、信用评分计算原理及信用行为影响。系统通过模拟数据生成信用报告,涵盖还款记录
|
11月前
|
存储 安全 大数据
网安工程师必看!AiPy解决fscan扫描数据整理难题—多种信息快速分拣+Excel结构化存储方案
作为一名安全测试工程师,分析fscan扫描结果曾是繁琐的手动活:从海量日志中提取开放端口、漏洞信息和主机数据,耗时又易错。但现在,借助AiPy开发的GUI解析工具,只需喝杯奶茶的时间,即可将[PORT]、[SERVICE]、[VULN]、[HOST]等关键信息智能分类,并生成三份清晰的Excel报表。告别手动整理,大幅提升效率!在安全行业,工具党正碾压手动党。掌握AiPy,把时间留给真正的攻防实战!官网链接:https://www.aipyaipy.com,解锁更多用法!
|
11月前
|
安全 BI
AiPy实战:批量解析 PDF 漏洞报告,今日高风险数据一键归档
作为安全合规部门的效率神器,AiPy工具让处理200+份PDF漏洞报告变得简单高效。只需三步:批量导入文件、精准提取高风险漏洞数据(如编号、名称、类型等),并生成无重复的Excel报表,极大减少手动操作与错误。示例中,从指定目录提取含“高”字样的漏洞信息,并按要求保存为以日期命名的Excel文件,确保数据唯一且完整。相比传统手动方式,AiPy不仅提升工作效率,还留出更多时间专注安全策略优化与技术研究,助你成为团队核心骨干!
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
315 10
|
消息中间件 缓存 运维
憋了半个月的 PDF:精通 Java(七)
真诚的和大家说一句抱歉,因为最近家庭原因 + 我自己思想的懒惰,所以导致有一段时间没有更新技术文章,一直都在憋这一篇关于学习 Java 如何从入门到精通的文章,在没有发文的这段时间很煎熬,甚至无数次的想放弃写这篇文章,因为这篇文章不是很好写,我付出大量的时间和心血来收集大量的素材、研究大量的书本进而熔铸成这篇文章,希望对你有所帮助。
憋了半个月的 PDF:精通 Java(七)
|
缓存 NoSQL Java
憋了半个月的 PDF:精通 Java(六)
真诚的和大家说一句抱歉,因为最近家庭原因 + 我自己思想的懒惰,所以导致有一段时间没有更新技术文章,一直都在憋这一篇关于学习 Java 如何从入门到精通的文章,在没有发文的这段时间很煎熬,甚至无数次的想放弃写这篇文章,因为这篇文章不是很好写,我付出大量的时间和心血来收集大量的素材、研究大量的书本进而熔铸成这篇文章,希望对你有所帮助。
憋了半个月的 PDF:精通 Java(六)
|
SQL 监控 Oracle
憋了半个月的 PDF:精通 Java(三)
真诚的和大家说一句抱歉,因为最近家庭原因 + 我自己思想的懒惰,所以导致有一段时间没有更新技术文章,一直都在憋这一篇关于学习 Java 如何从入门到精通的文章,在没有发文的这段时间很煎熬,甚至无数次的想放弃写这篇文章,因为这篇文章不是很好写,我付出大量的时间和心血来收集大量的素材、研究大量的书本进而熔铸成这篇文章,希望对你有所帮助。
憋了半个月的 PDF:精通 Java(三)

热门文章

最新文章