如何用Apache POI提取PPT幻灯片折线图数据并保存为XLSX文件
实现方案:从PPTX折线图提取源数据导出为XLSX
核心逻辑
利用Apache POI对OOXML格式的原生支持,直接读取PPTX中折线图内嵌的关联Excel源数据工作簿,无需手动解析图表序列值、坐标轴标签等零散数据,准确率与原生数据源完全一致。
前置依赖
需要引入Apache POI核心依赖(推荐使用5.2.5稳定版):
<!-- Maven依赖示例 --> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency> </dependencies>
分步实现代码
- 加载目标PPTX文件,定位到指定幻灯片
// 输入文件路径可根据实际场景修改 String pptxPath = "demo.pptx"; // 目标幻灯片索引从0开始,比如取第3张幻灯片对应索引为2 int targetSlideIndex = 2; try (FileInputStream pptFis = new FileInputStream(pptxPath); XMLSlideShow ppt = new XMLSlideShow(pptFis)) { // 校验幻灯片索引合法性 if (targetSlideIndex >= ppt.getSlides().size()) { throw new RuntimeException("幻灯片索引超出范围,文件总幻灯片数:" + ppt.getSlides().size()); } XSLFSlide targetSlide = ppt.getSlides().get(targetSlideIndex); }
- 遍历幻灯片形状,定位目标折线图
XSLFLineChart targetLineChart = null; for (XSLFShape shape : targetSlide.getShapes()) { // 图表属于图形框架类 if (!(shape instanceof XSLFGraphicFrame)) { continue; } XSLFGraphicFrame graphicFrame = (XSLFGraphicFrame) shape; XSLFChart chart = graphicFrame.getChart(); // 判断是否为折线图类型 if (chart instanceof XSLFLineChart) { targetLineChart = (XSLFLineChart) chart; // 如果需要匹配特定标题的折线图,可在此处加判断: // if ("月度销量趋势".equals(chart.getChartText().getText())) { break; } break; } } if (targetLineChart == null) { throw new RuntimeException("指定幻灯片中未找到折线图"); }
- 提取折线图关联的源数据工作簿
XSSFWorkbook sourceDataWb = null; // 折线图的关联源数据是内嵌的XLSX格式工作簿,遍历获取即可 for (Map.Entry<PackagePart, PackagePartName> embedEntry : targetLineChart.getEmbeddedWorkbooks().entrySet()) { PackagePart wbPart = embedEntry.getKey(); try (InputStream wbIs = wbPart.getInputStream()) { sourceDataWb = new XSSFWorkbook(wbIs); break; } } if (sourceDataWb == null) { throw new RuntimeException("未获取到折线图的关联源数据"); }
- 保存源数据为独立XLSX文件
// 输出文件路径可根据实际场景修改 String outputXlsxPath = "折线图源数据.xlsx"; try (FileOutputStream xlsxFos = new FileOutputStream(outputXlsxPath)) { sourceDataWb.write(xlsxFos); } sourceDataWb.close();
注意事项
- 幻灯片索引从0开始计数,第一张幻灯片对应索引0,需根据实际需求调整
- 单幻灯片存在多个折线图时,可通过图表标题、所在位置等属性补充匹配规则,避免定位错误
- 处理大体积PPTX时建议开启POI的临时文件配置,降低内存占用
- 所有IO资源需通过try-with-resources自动关闭,避免资源泄漏
内容的提问来源于stack exchange,提问作者Varun Vijayan
相关产品推荐
相关产品推荐

