【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

相关文章

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失