如何用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
相关产品推荐
相关产品推荐

