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

Apache POI生成的Excel折线图无法在Excel中显示求助

问题排查:Apache POI 5.2.3生成折线图在Excel中无法显示(提示移除drawing1.xml)

我们的Web应用长期使用Apache POI,当前版本为5.2.3。近期发现新生成及过往曾正常打开的旧文件中的折线图均无法在Excel中显示,Excel仅提示「Removed part: /xl/drawings/drawing1.xml」,文件其他内容显示正常;但在苹果Numbers及Mac预览中可正常查看折线图。

生成图表的核心代码如下:

XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, anchorR, 15, anchorR+20);
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleOverlay(false);
chart.setTitleText(title);
        
List<Integer> selected = selectedMap.get("integer");
        
XDDFChartAxis bottomAxis = chart.createCategoryAxis(org.apache.poi.xddf.usermodel.chart.AxisPosition.BOTTOM);
bottomAxis.setTitle("");
        
XDDFValueAxis leftAxis = chart.createValueAxis(org.apache.poi.xddf.usermodel.chart.AxisPosition.LEFT);
leftAxis.setTitle("");

XDDFDataSource<String> ticks_xaxis = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(headerRow, headerRow, startCol, noOfCol));
                
Map<Integer, String> lineNames = new HashMap<>();
int count_=0;
                
XDDFChartData lc = null;
if (!selected.isEmpty()) {
    List<XDDFNumericalDataSource<Double>> data = new ArrayList<>();
    for (Integer integer : selected) {
        int datar = startRow + integer;
        data.add(XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(datar, datar, startCol, noOfCol)));
        String lname = sheet.getRow(datar).getCell(0).getStringCellValue();
        lineNames.put(count_++, lname);
    }

    lc = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
        
    for (int d=0;d<data.size();d++) {
        XDDFNumericalDataSource<Double> line = data.get(d);
        XDDFLineChartData.Series ser = (XDDFLineChartData.Series) lc.addSeries(ticks_xaxis, line);
        ser.setTitle(lineNames.get(d), null);
        ser.setSmooth(true);
        ser.setMarkerStyle(MarkerStyle.NONE);
    }
    chart.plot(lc);
}       

以下是排查线索:

  • 检查Excel版本兼容性:部分旧版Excel对OOXML的图表格式支持有限,测试用最新版Office 365打开文件,确认是否是版本兼容问题。
  • 验证drawing1.xml的合法性:将损坏文件重命名为.zip,解压后查看/xl/drawings/drawing1.xml内容,检查是否存在XML语法错误(比如未闭合标签、非法字符)。Excel对XML格式的校验比Numbers严格,细微的语法问题就会导致整个绘图部分被移除。
  • 排查图表系列标题的空引用:代码中ser.setTitle(lineNames.get(d), null)的第二个参数传null可能导致Excel无法解析标题的关联关系。尝试改为传入对应单元格的引用(比如用new XSSFChartTextSource(sheet.getRow(datar).getCell(0))),避免空引用引发的XML结构问题。
  • 检查图表锚点边界:drawing.createAnchor(0, 0, 0, 0, 0, anchorR, 15, anchorR+20)中的列数(15)或行数(anchorR+20)是否超出工作表的有效范围,Excel对图表锚点的边界校验更严格,超出范围可能导致绘图部分被拒绝加载。
  • 升级Apache POI版本:5.2.3存在一些已知的图表渲染Bug(比如折线图平滑曲线处理、空轴标题的XML生成问题),尝试升级到最新稳定版(如5.2.5或更高),看是否能解决兼容性问题。
  • 测试简化版图表:先生成最基础的折线图(去掉平滑曲线、保留默认标记),确认是否能在Excel中正常显示,再逐步添加原有功能,定位是哪部分代码引发的问题。

内容的提问来源于stack exchange,提问作者Thomas HG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:27:49