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

