Java Excel转PDF方案分享

在企业数据报表场景中,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



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容