Java輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF的實(shí)戰(zhàn)指南
一、只適合三頁(yè)內(nèi)的PDF
使用幾行代碼就可以將我們的Excel轉(zhuǎn)為PDF格式,
先說(shuō)缺點(diǎn):這個(gè)jar包是收費(fèi)的,只能導(dǎo)出3頁(yè),不適合超過(guò)3頁(yè)P(yáng)DF文件的轉(zhuǎn)換。
1、在pom文件中導(dǎo)入workbook的所需依賴
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls.free</artifactId>
<version>5.1.0</version>
</dependency>如果不能自動(dòng)導(dǎo)入,則手動(dòng)導(dǎo)入
下載jar包到本地后
2.Win+R打開運(yùn)行,輸入cmd回車打開doc命令窗口
mvn install:install-file -Dfile=D:\spire.xls.free-5.1.0.jar -DgroupId=e-iceblue -DartifactId=spire.xls.free -Dversion=5.1.0 -Dpackaging=jar
顯示如下圖就是成功了

3.使用workbook導(dǎo)出整個(gè)Excel文件的代碼只需要兩步,我們可以直接看代碼示例:
/**
* 使用spire簡(jiǎn)單整個(gè)Excel轉(zhuǎn)換為pdf
*
* @param inputFilePath Excel文件路徑
* @param outputFilePath 導(dǎo)出的PDF文件路徑
*/
public static void totalExcelToPDF(String inputFilePath, String outputFilePath) {
Workbook wb = new Workbook();
// 引入Excel文件
wb.loadFromFile(inputFilePath);
// 導(dǎo)出PDF文件
wb.saveToFile(outputFilePath, FileFormat.PDF);
}本地文件快速測(cè)試:
import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;
@Test
public void test() {
// Excel文件路徑
String excelFilePath = "C:\\Users\\admin\\Downloads\\crossdock_plan_bol_2025-10-22 (1)\\test.xlsx";
// 加載Excel文件
Workbook workbook = new Workbook();
workbook.loadFromFile(excelFilePath);
// 構(gòu)造PDF文件路徑(與Excel文件同路徑,僅文件擴(kuò)展名不同)
String pdfFilePath = excelFilePath.replaceAll("\\.xlsx$", ".pdf");
// 保存為PDF到同路徑下
workbook.saveToFile(pdfFilePath, FileFormat.PDF);
System.out.println("PDF文件已保存到: " + pdfFilePath);
}
也指定單個(gè)的sheet頁(yè)轉(zhuǎn)為PDF,輸入指定的sheet頁(yè)的下標(biāo)即可。代碼示例如下:
/**
* 使用spire將單個(gè)sheet轉(zhuǎn)成pdf
*
* @param inputFilePath Excel文件路徑
* @param outputFilePath 導(dǎo)出的PDF文件路徑
* @param sheetNum 導(dǎo)出的sheet頁(yè)下標(biāo)
*/
public static void partExcelToPDF(String inputFilePath, String outputFilePath, int sheetNum) {
//加載Excel文檔
Workbook wb = new Workbook();
wb.loadFromFile(inputFilePath);
//獲取到哪一個(gè)sheet頁(yè)
Worksheet sheet = wb.getWorksheets().get(sheetNum);
//調(diào)用方法保存為PDF格式
sheet.saveToPdf(outputFilePath);
}補(bǔ)充:
這個(gè)好像也可以,都差不多
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>9.13.0</version>
</dependency>二、多頁(yè)的(破解版)
移除水印原理:
替換指定文字為白色的遮罩層
String afterDestPdfFileName = "formal-" + middleFileName + ".pdf";
AsposePdfUtil.replaceStr(attachRecordsThinVo.getDirectoryName().concat(destPdfFileName),
attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName),
"Evaluation Only. Created with Aspose.Cells for Java.Copyright 2003 - 2023 Aspose Pty Ltd."); /**
* 替換指定文字為白色的遮罩層
* @param src 需要被轉(zhuǎn)換的帶全路徑文件名
* @param dest 轉(zhuǎn)換之后pdf的帶全路徑文件名
* @param replaceStr 指定轉(zhuǎn)換的文字(水印的文字)
*/
public static void replaceStr(String src, String dest, String replaceStr) {
try {
List<String> resu = new ArrayList<>();
PdfReader reader = new PdfReader(src);
//獲取指定文字的坐標(biāo)(就是上一步生成的pdf水印)
getKeyWords(reader,replaceStr,resu);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
for (int i = 1; i <= resu.size(); i++) {
String xy = resu.get(i - 1);
PdfContentByte canvas = stamper.getOverContent(i);
// canvas.showTextAligned(PdfContentByte.ALIGN_CENTER, "", 15, 15, 0);
// canvas.set
canvas.saveState();
//設(shè)置顏色
canvas.setColorFill(BaseColor.WHITE);
//解析坐標(biāo)
double x = Double.valueOf(xy.split("--")[0]);
double y = Double.valueOf(xy.split("--")[1]) - 10;
//后面2個(gè)參數(shù)分別是寬高
canvas.rectangle(x, y, 450, 100);
canvas.fill();
canvas.restoreState();
}
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
補(bǔ)充:
private AttachRecords complex_fill_pod_excel_to_pdf(KeyVo keyVo, List<BaseVo> detailInfo, ResourceLoader resourceLoader, String fileName) throws IOException {
log.info("complex_fill_pod_excel_to_pdf input param,keyVo:{},detailInfo:{},fileName:{}", JSONObject.toJSONString(keyVo),
JSONObject.toJSONString(detailInfo), fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
// 模板注意 用{} 來(lái)表示你要用的變量 如果本來(lái)就有"{","}" 特殊字符 用"\{","\}"代替
// {} 代表普通變量 {.} 代表是list的變量
InputStream inputStream = resourceLoader.getResource(BOL_POD_TEMPLATE_NEW_FORMAT).getInputStream();
ExcelWriter excelWriter = EasyExcel.write(bos).withTemplate(inputStream).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 這里注意 入?yún)⒂昧薴orceNewRow 代表在寫入list的時(shí)候不管list下面有沒有空行 都會(huì)創(chuàng)建一行,然后下面的數(shù)據(jù)往后移動(dòng)。默認(rèn) 是false,會(huì)直接使用下一行,如果沒有則創(chuàng)建。
// forceNewRow 如果設(shè)置了true,有個(gè)缺點(diǎn) 就是他會(huì)把所有的數(shù)據(jù)都放到內(nèi)存了,所以慎用
// 簡(jiǎn)單的說(shuō) 如果你的模板有l(wèi)ist,且list不是最后一行,下面還有數(shù)據(jù)需要填充 就必須設(shè)置 forceNewRow=true 但是這個(gè)就會(huì)把所有數(shù)據(jù)放到內(nèi)存 會(huì)很耗內(nèi)存
// 如果數(shù)據(jù)量大 list不是最后一行 參照下一個(gè)
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(detailInfo, fillConfig, writeSheet);
excelWriter.fill(keyVo, writeSheet);
excelWriter.finish();
if (ObjectUtil.isEmpty(bos) || bos.size() == 0){
log.error("complex_fill_pod_excel_to_pdf error bos is null");
return null;
}
String middleFileName = UUID.randomUUID().toString();
// 生成原excel文件
String sourceExcelFileName = "excel-" + middleFileName + ".xlsx";
AttachRecordsThinVo attachRecordsThinVo = attachRecordsService.directSaveFile(sourceExcelFileName, bos.toByteArray());
if (ObjectUtil.isEmpty(attachRecordsThinVo)){
log.error("attachRecordsThinVo is null");
return null;
}
// 轉(zhuǎn)成pdf
String destPdfFileName = "temp-" + middleFileName + ".pdf";
AsposePdfUtil.excel2pdf(attachRecordsThinVo.getDirectoryName().concat(sourceExcelFileName),
attachRecordsThinVo.getDirectoryName().concat(destPdfFileName), null);
// 移除水印
String afterDestPdfFileName = "formal-" + middleFileName + ".pdf";
AsposePdfUtil.replaceStr(attachRecordsThinVo.getDirectoryName().concat(destPdfFileName),
attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName),
"Evaluation Only. Created with Aspose.Cells for Java.Copyright 2003 - 2023 Aspose Pty Ltd.");
// 本地生成的文件,上傳到阿里oss
AttachRecords attachRecords = attachRecordsService.uploadAttachRecords(fileName,
attachRecordsThinVo.getDownloadDirectoryName().concat(afterDestPdfFileName),
FileUtils.readFileToByteArray(new File(attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName))));
log.info("complex_fill_pod_excel_to_pdf result attachRecords:{}",JSONObject.toJSONString(attachRecords));
return attachRecords;
} catch (Exception e) {
log.error("complex_fill_pod_excel_to_pdf error!", e);
e.printStackTrace();
throw new ApiException(ResultCode.FAULT);
} finally {
bos.close();
}
}到此這篇關(guān)于Java輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java Excel轉(zhuǎn)PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中將excel轉(zhuǎn)pdf多種實(shí)現(xiàn)方式
- Java利用Spire.PDF for Java將PDF轉(zhuǎn)換為Excel的實(shí)現(xiàn)方法
- Java將Word、Excel、PDF和PPT轉(zhuǎn)換為OFD格式的詳細(xì)步驟
- Java輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF的代碼示例
- Java多種方式實(shí)現(xiàn)Excel轉(zhuǎn)Pdf的保姆級(jí)教程
- Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的完整方案分享
- 基于Java實(shí)現(xiàn)將word,excel文件轉(zhuǎn)換為pdf的工具類
相關(guān)文章
詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)
IoC?和?DI?是?Spring?中最重要的兩個(gè)概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實(shí)現(xiàn)。那么?DI?實(shí)現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來(lái)和大家一起詳細(xì)聊聊2022-08-08
SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)
這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Spring Cloud之注冊(cè)中心Nacos的使用詳解
本文介紹SpringCloud Alibaba中的Nacos組件,對(duì)比了Nacos與Eureka的區(qū)別,展示了如何在項(xiàng)目中引入SpringCloud Alibaba和Nacos,并配置負(fù)載均衡,通過(guò)實(shí)際操作,驗(yàn)證了服務(wù)注冊(cè)和負(fù)載均衡的功能,感興趣的朋友一起看看吧2025-03-03
Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢
這篇文章主要介紹了Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀
這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢
這里我們來(lái)以實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢,包括一對(duì)多、多對(duì)一的關(guān)聯(lián)查詢以及自身關(guān)聯(lián)映射的方法等,需要的朋友可以參考下2016-06-06
Hystrix?Turbine聚合監(jiān)控的實(shí)現(xiàn)詳解
微服務(wù)架構(gòu)下,?個(gè)微服務(wù)往往部署多個(gè)實(shí)例,如果每次只能查看單個(gè)實(shí)例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場(chǎng)景下,我們可以使??Hystrix?Turbine?進(jìn)?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控?cái)?shù)據(jù)聚合在?起,便于查看2022-09-09

