Java 实现 Excel 转 PDF 的完整指南:从入门到实战

引言

在企业办公和数据处理中,Excel 和 PDF 是两种非常普遍的文件格式。Excel 适合数据分析和编辑,而 PDF 则便于归档和分享。因此,将 Excel 转换为 PDF 成为了许多 Java 开发者的必备技能。

技术选型

Java 生态中,有多种库可以实现 Excel 到 PDF 的转换。以下是几个主流选择:

  • Apache POI:微软 Office 格式的开源 Java API,可以读取和操作 Excel 文件。
  • iText:一个强大的 PDF 生成库,支持从头创建 PDF 或将其他格式转换为 PDF。
  • OpenPDF:iText 的一个分支,提供免费开源选项。
  • Aspose.Cells:商业库,功能全面但需要付费许可。

对于大多数项目,Apache POI + iText 的组合是一个开源且高效的方案。

环境搭建

首先,在项目的 pom.xml 中添加必要的 Maven 依赖:

<dependencies>
    <!-- Apache POI for 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 for PDF -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-core</artifactId>
        <version>7.2.5</version>
        <type>pom</type>
    </dependency>
</dependencies>

核心实现步骤

转换过程主要分为以下几个步骤:

  1. 读取 Excel 文件:使用 Apache POI 加载 .xls.xlsx 文件。
  2. 创建工作簿:解析 Excel 中的工作表、行、列和单元格数据。
  3. 生成 PDF 文档:使用 iText 创建 PDF 文件,将 Excel 数据逐行写入 PDF。
  4. 处理样式与格式:尽可能保留原始 Excel 的字体、颜色、边框等样式。

代码示例

以下是一个简单的工具类示例,演示如何将 Excel 文件转换为 PDF:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Table;
import org.apache.poi.ss.usermodel.*;
import java.io.*;

public class ExcelToPdfConverter {
    public static void convert(String excelPath, String pdfPath) throws IOException {
        // 1. 加载 Excel 文件
        InputStream excelFile = new FileInputStream(excelPath);
        Workbook workbook = WorkbookFactory.create(excelFile);
        Sheet sheet = workbook.getSheetAt(0);

        // 2. 创建 PDF 文档
        PdfWriter writer = new PdfWriter(pdfPath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document document = new Document(pdfDoc);

        // 3. 创建 PDF 表格(假设 Excel 有 5 列)
        Table table = new Table(5).useAllAvailableWidth();

        // 4. 遍历 Excel 行并添加到 PDF
        for (Row row : sheet) {
            for (int cn = 0; cn < row.getLastCellNum(); cn++) {
                Cell cell = row.getCell(cn);
                String cellValue = cell != null ? cell.toString() : "";
                table.addCell(new Cell().add(cellValue));
            }
        }

        // 5. 添加表格到文档并关闭
        document.add(table);
        document.close();
        workbook.close();
        System.out.println("转换完成!PDF 已保存到: " + pdfPath);
    }

    public static void main(String[] args) throws IOException {
        convert("input.xlsx", "output.pdf
    }
}

进阶考虑与优化

  • 样式保留:可以通过 POI 读取单元格的样式(字体、背景色等),并在 iText 中对应设置。
  • 图片处理:如果 Excel 中包含图片,需要先用 POI 提取图片,再通过 iText 插入 PDF。
  • 性能优化:对于大文件,考虑使用流式处理或分块读写,避免内存溢出。
  • 依赖管理:注意 Apache POI 和 iText 的版本兼容性,避免冲突。

常见问题

Q: 转换后表格格式错乱怎么办?

A: 需要手动调整 PDF 表格的列宽和行高,可以基于 Excel 列宽按比例计算。

Q: 是否支持多个工作表?

A: 当前示例只处理第一个工作表。可以循环 workbook 中的所有工作表,并在 PDF 中分页显示。

结论

通过结合 Apache POIiText,Java 开发者可以高效地实现 Excel 到 PDF 的转换。虽然基础实现相对直接,但要处理复杂格式和样式仍需进一步优化。建议根据实际需求测试并调整代码,以达到最佳效果。

提示:对于生产环境,考虑使用更成熟的库如 Aspose.Cells,或采用在线转换服务以降低开发维护成本。