Java实现Excel转PDF的完整方案分享
作者:用户372157426135
在企业数据报表场景中,Excel转PDF是实现文档安全分发的刚需。传统的Apache POI需配合PDFBox才能实现格式转换,不仅开发流程复杂,还易出现样式丢失、布局错位等问题。这里分享Spire.XLS for Java方案,支持直接输出高保真PDF,无需安装Office环境,保留原表格的公式、图表、样式等核心元素。3行代码即可完成基础转换。
一、开发环境准备
必要环境
JDK 1.8+ (推荐JDK 17)
Maven项目(Gradle配置可参考官方文档)
添加依赖
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>15.7.7</version>
</dependency>
</dependencies>
二、基础转换实现
2.1 完整工作簿转PDF
import com.spire.xls.*;
public class ExcelToPDF {
public static void main(String[] args) {
// 加载Excel文件
Workbook workbook = new Workbook();
workbook.loadFromFile("财务报表.xlsx");
// 转换为PDF,保留完整工作表
workbook.saveToFile("output.pdf", FileFormat.PDF);
// 释放资源
workbook.dispose();
}
}
注意事项
- 支持
.xls和.xlsx格式输入 - 若需禁止分页,通过
workbook.getConverterSetting().setSheetFitToPage(true)将页面内容缩放到1页
2.2 精准区域转PDF
通过Worksheet.getPageSetup().setPrintArea()指定输出范围,避免全表冗余:
// 选取Sheet1
Worksheet sheet = workbook.getWorksheets().get(0);
// 选取Sheet1的A1到F20区域
sheet.getPageSetup().setPrintArea("A1:F20");
// 执行区域转换
sheet.saveToPdf("区域报表.pdf",);
| 参数 | 配置方法 | 推荐场景 |
|---|---|---|
| 页面方向 | setOrientation() | 宽表(如横向财务报表) |
| 缩放比例 | setZoom() | 小字号内容放大 |
| 边距控制 | setTopMargin() (上边距) | 最大化打印区域 |
三、企业级场景解决方案
3.1 批量转换优化
使用线程池+资源释放提升吞吐量:
ExecutorService executor = Executors.newFixedThreadPool(4);
List<Path> excelFiles = getBatchFiles(); // 假设获取批量文件路径
for (Path file : excelFiles) {
executor.execute(() -> {
Workbook wb = new Workbook();
try {
wb.loadFromFile(file.toString());
wb.saveToFile(file + ".pdf", FileFormat.PDF);
} finally {
wb.dispose(); // 必须释放,避免内存泄漏
}
});
}
3.2 动态水印与LOGO
通过页眉插入企业标识+日期:
PageSetup page = sheet.getPageSetup();
page.setLeftHeader("&"Calibri"&12&KFF0000 " +
LocalDate.now() + " 机密文件"); // 红色字体水印
// 添加LOGO(需图片本地路径)
page.setLeftHeaderImage("logo.png");
page.setLeftHeader("&G"); // &G表示图片占位符
四、实践建议
异常处理清单
| 异常类型 | 排查方向 |
|---|---|
| FileNotFoundException | 检查输入路径权限及空格转义 |
| OutOfMemoryError | 分批处理大文件,及时dispose |
五、方法补充
Java实现Excel转PDF的两种方法
使用spire转化PDF
首先介绍一种比较简单的方法,这种方法可以使用短短的几行代码就可以将我们的Excel文件中的某一个sheet页或者整个Excel文件转为PDF格式,
但是这种方法有一个缺点就是这个jar包是收费的,只能导出3个sheet页,不适合有多个sheet页的Excel文件的转换。
使用时首先在pom文件中导入workbook的所需依赖:
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls.free</artifactId>
<version>2.2.0</version>
</dependency>
使用spire将整个Excel文件转为PDF
使用workbook导出整个Excel文件的代码只需要两步,我们可以直接看代码示例:
/**
* 使用spire简单整个Excel转换为pdf
*
* @param inputFilePath Excel文件路径
* @param outputFilePath 导出的PDF文件路径
*/
public static void totalExcelToPDF(String inputFilePath, String outputFilePath) {
Workbook wb = new Workbook();
// 引入Excel文件
wb.loadFromFile(inputFilePath);
// 导出PDF文件
wb.saveToFile(outputFilePath, FileFormat.PDF);
}
指定单个的sheet页转为PDF
使用spire可以将指定单个sheet页面转为PDF格式输出,在这里需要输入指定的sheet页的下标。代码示例如下:
/**
* 使用spire将单个sheet转成pdf
*
* @param inputFilePath Excel文件路径
* @param outputFilePath 导出的PDF文件路径
* @param sheetNum 导出的sheet页下标
*/
public static void partExcelToPDF(String inputFilePath, String outputFilePath, int sheetNum) {
//加载Excel文档
Workbook wb = new Workbook();
wb.loadFromFile(inputFilePath);
//获取到哪一个sheet页
Worksheet sheet = wb.getWorksheets().get(sheetNum);
//调用方法保存为PDF格式
sheet.saveToPdf(outputFilePath);
}
以上使用spire来实现Excel转换PDF的方法虽然简单,但是不适合于较大的Excel文件转化,只适合有小于3个sheet页的文件使用。
所以在企业项目开发中,如果想要将大批量的Excel文件或sheet页较多的Excel文件整体转化为PDF格式的话,还是推荐使用下面这种方法,而且这种方法使用稳定还免费!
使用jacob实现Excel转PDF(推荐使用)
环境准备
在使用jacob之前需要做一些准备,首先需要去下载jacob的压缩包jacob.zip
接下来在在Maven中引入Jacob所需依赖:
<!--jacob依赖-->
<dependency>
<groupId>com.jacob</groupId>
<artifactId>jacob</artifactId>
<version>1.19</version>
<scope>system</scope>
<!--本地的jacob.jar的路径-->
<systemPath>D:\DevInstall\jacob18,19\jacob-1.19\jacob.jar</systemPath>
</dependency>
注意:上面依赖中标签的值就是你的jacob.jar的具体路径,这个改成自己刚才下载的对应的路径就行了。
执行导出PDF
执行Excel导出PDF的方法如下:其中比较重要的地方进行了注释,方法可以直接拿来用即可!
/**
* 使用jacob实现excel转PDF
*
* @param inputFilePath 导入Excel文件路径
* @param outputFilePath 导出PDF文件路径
*/
public static void jacobExcelToPDF(String inputFilePath, String outputFilePath) {
ActiveXComponent ax = null;
Dispatch excel = null;
try {
ComThread.InitSTA();
ax = new ActiveXComponent("Excel.Application");
ax.setProperty("Visible", new Variant(false));
// 禁用宏
ax.setProperty("AutomationSecurity", new Variant(3));
Dispatch excels = ax.getProperty("Workbooks").toDispatch();
Object[] obj = {
inputFilePath,
new Variant(false),
new Variant(false)
};
excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();
// 转换格式
Object[] obj2 = {
// PDF格式等于0
new Variant(0),
outputFilePath,
// 0=标准(生成的PDF图片不会模糊),1=最小的文件
new Variant(0)
};
Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, obj2, new int[1]);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (excel != null) {
Dispatch.call(excel, "Close", new Variant(false));
}
if (ax != null) {
ax.invoke("Quit", new Variant[]{});
ax = null;
}
ComThread.Release();
}
}
到此这篇关于Java实现Excel转PDF的完整方案分享的文章就介绍到这了,更多相关Java Excel转PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
