【Excel PDF 系列】EasyExcel + iText 库

2024-02-27 14:12
文章标签 excel 系列 pdf itext easyexcel

本文主要是介绍【Excel PDF 系列】EasyExcel + iText 库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你知道的越多,你不知道的越多
点赞再看,养成习惯
如果您有疑问或者见解,欢迎指教:
企鹅: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>
代码实现
定义 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 传递到监听器也可以通过这种注入方式实现。

这篇关于【Excel PDF 系列】EasyExcel + iText 库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/752672

相关文章

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.