You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java的Apache POI读取Excel图表并导出至PDF?

实现Java读取Excel图表并插入PDF的方案

Apache POI对Excel图表的直接渲染支持确实有限,单纯用XSSFChart、XSSFChartData很难直接导出可用的图表内容。推荐的思路是先将Excel图表转为图片,再把图片插入PDF,下面是具体实现步骤和代码:

一、依赖准备

需要引入Apache POI相关包处理Excel,以及iText处理PDF:

<!-- Apache POI 处理XLSX -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>
<!-- iText 生成PDF -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.5</version>
</dependency>

二、将Excel图表转为图片

通过Apache POI读取Excel,提取图表并渲染为BufferedImage,再保存为临时图片:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ExcelChartToImage {
    public static File convertChartToImage(String excelPath, int sheetIndex, int chartIndex) throws IOException {
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream(excelPath))) {
            XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(sheetIndex);
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            XSSFChart chart = (XSSFChart) drawing.getCharts().get(chartIndex);

            // 渲染图表到BufferedImage
            BufferedImage image = new BufferedImage(chart.getWidth(), chart.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = image.createGraphics();
            chart.plot(g2d);
            g2d.dispose();

            // 保存为临时图片文件
            File tempImage = File.createTempFile("excel_chart_", ".png");
            ImageIO.write(image, "png", tempImage);
            return tempImage;
        }
    }
}

三、将图片插入PDF

用iText创建PDF文档,并插入刚才生成的图片:

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;

import java.io.File;
import java.io.IOException;

public class ImageToPdf {
    public static void createPdfWithImage(String pdfPath, File chartImage) throws IOException {
        try (PdfWriter writer = new PdfWriter(pdfPath);
             PdfDocument pdfDoc = new PdfDocument(writer);
             Document document = new Document(pdfDoc)) {

            // 插入图片到PDF,可调整大小适配页面
            Image image = new Image(ImageDataFactory.create(chartImage.getAbsolutePath()));
            image.setWidth(pdfDoc.getDefaultPageSize().getWidth() - 50); // 左右留边距
            document.add(image);
        }
    }
}

四、主方法调用

public class Main {
    public static void main(String[] args) {
        try {
            // 读取Excel中的第1个工作表(索引0)的第1个图表(索引0)
            File chartImage = ExcelChartToImage.convertChartToImage("your_excel_file.xlsx", 0, 0);
            // 生成包含图表的PDF
            ImageToPdf.createPdfWithImage("output.pdf", chartImage);
            // 可选:删除临时图片
            chartImage.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意事项

  • 仅支持.xlsx格式的Excel文件(XSSF处理的是OOXML格式),如果是.xls需要改用HSSF相关类,但HSSF对图表的支持更有限。
  • 复杂图表(如组合图、3D图)可能渲染效果不佳,需要根据实际图表类型调整渲染逻辑。
  • 临时图片可根据需求选择保留或自动删除,deleteOnExit()会在JVM退出时删除文件。

内容的提问来源于stack exchange,提问作者Mohamed Khalid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:27:33