使用Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的示例詳解
在實(shí)際的開(kāi)發(fā)過(guò)程中,我們常常會(huì)遇到需要將 Excel 文件轉(zhuǎn)換為 PDF 文件的需求。Java 提供了多種庫(kù)和工具來(lái)實(shí)現(xiàn)這個(gè)功能,下面我將為你介紹一種常見(jiàn)的實(shí)現(xiàn)方式,使用 Apache POI 讀取 Excel 文件,再使用 iText 生成 PDF 文件。
1. 引入所需的庫(kù)
首先,我們需要在項(xiàng)目中引入 Apache POI 和 iText 相關(guān)的庫(kù)。如果你使用的是 Maven 項(xiàng)目,就在 pom.xml 文件里添加以下依賴(lài):
<!-- Apache POI 用于讀取 Excel 文件 -->
<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>
<!-- iText 用于生成 PDF 文件 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
2. 實(shí)現(xiàn) Excel 轉(zhuǎn) PDF 的代碼
下面是具體的 Java 代碼示例:
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class ExcelToPdfConverter {
public static void main(String[] args) {
try {
// 讀取 Excel 文件
FileInputStream excelFile = new FileInputStream("input.xlsx");
Workbook workbook = new XSSFWorkbook(excelFile);
Sheet sheet = workbook.getSheetAt(0);
// 創(chuàng)建 PDF 文檔
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
document.open();
// 創(chuàng)建 PDF 表格,列數(shù)與 Excel 表格的列數(shù)相同
int columnCount = sheet.getRow(0).getLastCellNum();
PdfPTable pdfTable = new PdfPTable(columnCount);
// 遍歷 Excel 表格的每一行
for (Row row : sheet) {
// 遍歷當(dāng)前行的每一個(gè)單元格
for (Cell cell : row) {
// 獲取單元格的值
String cellValue = getCellValueAsString(cell);
// 創(chuàng)建 PDF 表格的單元格
PdfPCell pdfCell = new PdfPCell(new Phrase(cellValue));
// 將單元格添加到 PDF 表格中
pdfTable.addCell(pdfCell);
}
}
// 將 PDF 表格添加到 PDF 文檔中
document.add(pdfTable);
// 關(guān)閉文檔和 Excel 文件
document.close();
workbook.close();
excelFile.close();
System.out.println("Excel 轉(zhuǎn) PDF 成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Excel 轉(zhuǎn) PDF 失?。? + e.getMessage());
}
}
// 將單元格的值轉(zhuǎn)換為字符串
private static String getCellValueAsString(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue().toString();
} else {
return String.valueOf(cell.getNumericCellValue());
}
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
case FORMULA:
return cell.getCellFormula();
default:
return "";
}
}
}
3. 代碼詳細(xì)解釋
1.讀取 Excel 文件:
- FileInputStream excelFile = new FileInputStream("input.xlsx");:創(chuàng)建一個(gè) FileInputStream 對(duì)象,用于讀取 input.xlsx 文件。
- Workbook workbook = new XSSFWorkbook(excelFile);:使用 XSSFWorkbook 類(lèi)創(chuàng)建一個(gè) Workbook 對(duì)象,用于表示 Excel 文件。
- Sheet sheet = workbook.getSheetAt(0);:獲取 Excel 文件的第一個(gè)工作表。
2.創(chuàng)建 PDF 文檔:
- Document document = new Document();:創(chuàng)建一個(gè) Document 對(duì)象,用于表示 PDF 文檔。
- PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));:使用 PdfWriter 將 Document 對(duì)象與 FileOutputStream 關(guān)聯(lián)起來(lái),指定生成的 PDF 文件名為 output.pdf。
- document.open();:打開(kāi) PDF 文檔,準(zhǔn)備寫(xiě)入內(nèi)容。
3.創(chuàng)建 PDF 表格:
- int columnCount = sheet.getRow(0).getLastCellNum();:獲取 Excel 表格第一行的列數(shù)。
- PdfPTable pdfTable = new PdfPTable(columnCount);:創(chuàng)建一個(gè) PdfPTable 對(duì)象,用于表示 PDF 表格,列數(shù)與 Excel 表格的列數(shù)相同。
4.遍歷 Excel 表格并填充 PDF 表格:
- for (Row row : sheet) {... }:遍歷 Excel 表格的每一行。
- for (Cell cell : row) {... }:遍歷當(dāng)前行的每一個(gè)單元格。
- String cellValue = getCellValueAsString(cell);:調(diào)用 getCellValueAsString 方法將單元格的值轉(zhuǎn)換為字符串。
- PdfPCell pdfCell = new PdfPCell(new Phrase(cellValue));:創(chuàng)建一個(gè) PdfPCell 對(duì)象,用于表示 PDF 表格的單元格。
- pdfTable.addCell(pdfCell);:將 PdfPCell 對(duì)象添加到 PdfPTable 中。
5.將 PDF 表格添加到 PDF 文檔中:
document.add(pdfTable);:將 PdfPTable 對(duì)象添加到 Document 中。
6.關(guān)閉文檔和 Excel 文件:
document.close(); workbook.close(); excelFile.close();:關(guān)閉 PDF 文檔、Excel 文件和輸入流,釋放資源。
4. 注意事項(xiàng)
上述代碼僅處理了 Excel 文件的第一個(gè)工作表,如果需要處理多個(gè)工作表,可以使用 workbook.getNumberOfSheets() 方法獲取工作表的數(shù)量,然后遍歷每個(gè)工作表進(jìn)行處理。
代碼中的 getCellValueAsString 方法用于將不同類(lèi)型的單元格值轉(zhuǎn)換為字符串,確保在處理不同類(lèi)型的單元格時(shí)不會(huì)出現(xiàn)異常。
到此這篇關(guān)于使用Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的示例詳解的文章就介紹到這了,更多相關(guān)Java Excel轉(zhuǎn)PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡(jiǎn)單實(shí)現(xiàn),咱們今天來(lái)講使用QQ郵箱來(lái)發(fā)送和接收驗(yàn)證碼,首先來(lái)介紹一下它在SpringBoot項(xiàng)目中的具體應(yīng)用,需要的朋友可以參考下2023-04-04
Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了 SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Java實(shí)戰(zhàn)之多線程模擬站點(diǎn)售票
今天帶大家來(lái)練習(xí)Java實(shí)戰(zhàn),文中多線程模擬站點(diǎn)售票這個(gè)問(wèn)題作了詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
springboot整合mybatis分頁(yè)攔截器的問(wèn)題小結(jié)
springboot整合mybatis分頁(yè)攔截器,分頁(yè)攔截實(shí)際上就是獲取sql后將sql拼接limit,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
關(guān)于java的九個(gè)預(yù)定義Class對(duì)象
這篇文章主要介紹了關(guān)于java的九個(gè)預(yù)定義Class對(duì)象,在Java中,沒(méi)有類(lèi)就無(wú)法做任何事情。然而,并不是所有的類(lèi)都具有面向?qū)ο筇卣?。如Math.random,并只需要知道方法名和參數(shù),需要的朋友可以參考下2023-05-05
詳解java中finalize的實(shí)現(xiàn)與相應(yīng)的執(zhí)行過(guò)程
在常規(guī)的java書(shū)籍中,即會(huì)描述 object的finalize方法是用于一些特殊的對(duì)象在回收之前再做一些掃尾的工作,但是并沒(méi)有說(shuō)明此是如何實(shí)現(xiàn)的.本篇從java的角度(不涉及jvm以及c++),有需要的朋友們可以參考借鑒。2016-09-09
SpringBoot參數(shù)校驗(yàn)之@Validated的使用詳解
這篇文章主要通過(guò)示例為大家詳細(xì)介紹一下介紹了SpringBoot參數(shù)校驗(yàn)中@Validated的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06
基于Mybatis-plus實(shí)現(xiàn)多租戶(hù)架構(gòu)的全過(guò)程
多租戶(hù)是一種軟件架構(gòu)技術(shù),在多用戶(hù)的環(huán)境下,共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于基于Mybatis-plus實(shí)現(xiàn)多租戶(hù)架構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-02-02

