【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.pswp.cn/news/714455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714455.shtml
英文地址,請注明出處:http://en.pswp.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 算法圍繞三個不…

【Ubuntu操作系統】講解

Ubuntu操作系統 1. 前言2. 系統更新3. 安裝編譯工具4. 安裝文本編輯器4.1 Vim4.2 Visual Studio Code 5. 安裝開發庫6. 安裝版本控制系統6.1 Git 7. 安裝數據庫7.1 MySQL7.2 PostgreSQL 8. 安裝編程語言環境8.1 Python8.2 Node.js 9. 安裝其他常用軟件9.1 Chrome瀏覽器9.2 Dock…

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…

內核參數調優

默認的Linux內核參數考慮的是最通用場景&#xff0c;不符合用于支持高并發訪問的Web服務器的定義&#xff0c;根據業務特點來進行調整&#xff0c;當Nginx作為靜態web內容服務器、反向代理或者提供壓縮服務器的服務器時&#xff0c;內核參數的調整都是不同的&#xff0c;此處針…

【牛客】SQL131 作答試卷得分大于過80的人的用戶等級分布

描述 現有用戶信息表user_info&#xff08;uid用戶ID&#xff0c;nick_name昵稱, achievement成就值, level等級, job職業方向, register_time注冊時間&#xff09;&#xff1a; iduidnick_nameachievementleveljobregister_time11001牛客1號31007算法2020-01-01 10:00:00210…

常見外設學習以及無線通信頻率

常見外設 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…

acwing算法提高之搜索--雙向廣搜BFS與A星算法

目錄 1 專題說明2 訓練 1 專題說明 本專題用來記錄使用雙向廣搜BFS和A星算法求解的題目。 2 訓練 題目1&#xff1a;190字串變換 考點&#xff1a;從起點開始搜&#xff0c;從終點開始搜&#xff0c;即雙向廣搜。 C代碼如下&#xff0c; #include <iostream> #incl…

攻防世界-get_post

題目信息 相關知識 -G&#xff1a;表示GET請求&#xff0c;缺省POST -d參數用于發送 POST 請求的數據體 使用-d參數以后&#xff0c;HTTP 請求會自動加上標頭Content-Type : application/x-www-form-urlencoded。并且會自動將請求轉為 POST 方法&#xff0c;因此可以省略-X PO…