Java实现Excel转PDF的完整方案分享

 更新时间:2025年08月15日 09:07:13   作者:用户372157426135  
在企业数据报表场景中,Excel转PDF是实现文档安全分发的刚需,本文主要和大家分享了如何使用Java自动化实现该流程,需要的小伙伴可以参考一下

在企业数据报表场景中,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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot返回值转成JSONString的处理方式

    springboot返回值转成JSONString的处理方式

    这篇文章主要介绍了springboot返回值转成JSONString的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序,这篇文章主要介绍了在VSCode里使用Jupyter Notebook,调试Java代码,需要的朋友可以参考下
    2022-07-07
  • Java中使用Preferences 的 API设置用户偏好

    Java中使用Preferences 的 API设置用户偏好

    这篇文章主要介绍了Java中使用Preferences 的 API设置用户偏好的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Java在 PDF 中添加数字签名、水印与权限控制的详细过程

    Java在 PDF 中添加数字签名、水印与权限控制的详细过程

    通过在PDF中添加数字签名、水印以及权限控制,不仅可以防止文档被擅自修改或打印,还能提升文档的法律效力与专业性,下面给大家介绍Java在PDF中添加数字签名、水印与权限控制的详细过程,感兴趣的朋友一起看看吧
    2025-06-06
  • lombok 子类中如何使用@Builder问题

    lombok 子类中如何使用@Builder问题

    这篇文章主要介绍了lombok 子类中如何使用@Builder问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java使用ObjectMapper的简单示例

    Java使用ObjectMapper的简单示例

    这篇文章主要介绍了Java使用ObjectMapper的简单示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 深入了解Spring中最常用的11个扩展点

    深入了解Spring中最常用的11个扩展点

    我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。今天就来跟大家一起聊聊,在Spring中最常用的11个扩展点
    2022-09-09
  • JavaWeb 使用Session实现一次性验证码功能

    JavaWeb 使用Session实现一次性验证码功能

    这篇文章主要介绍了JavaWeb 使用Session实现一次性验证码功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Netty源码分析NioEventLoop初始化线程选择器创建

    Netty源码分析NioEventLoop初始化线程选择器创建

    这篇文章主要介绍了Netty源码分析NioEventLoop初始化线程选择器创建,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • JAVA代理,静态,动态详解

    JAVA代理,静态,动态详解

    这篇文章主要介绍了Java静态代理和动态代理总结,非常不错,具有参考借鉴价值,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09

最新评论