使用 Apache POI 创建的 Excel 文件将不再显示折线图

Excel files created with Apache POI won't show line chart anymore

提问人:Thomas HG 提问时间:11/6/2023 更新时间:11/7/2023 访问量:78

问:

我们在 Web 应用程序中使用 Apache POI 已有“多年”了。突然间,从我们的应用程序创建的新文件和旧文件都不会显示折线图。现在我们使用的是 5.2.3,但今年春天创建的文件,曾经打开过,也不再打开!?我得到的唯一“错误”是在 Excel 中,它说(所以其他所有内容看起来都应该如此)Removed part: /x1/drawings/drawing1.xml

如果我在(Apples)Numbers中打开折线图,甚至在(Mac)Finder的“预览”中打开它,我可以看到它。

(应该)生成图表的代码是:

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);
}       

表格没有问题(有序列试图“读取”的数据)等等。

我知道很难看出问题是因为我无法为您提供完整的源代码,但我希望有人以前遇到过这个问题!我试图看看是否有一些依赖关系搞砸了任何东西。所以。。任何提示,我都听进去了!

Java Excel Apache - POI

评论


答:

1赞 Axel Richter 11/7/2023 #1

使用 Apache POI 的所有当前图表问题

Apache poi MS excel 损坏 -> 在包含条形图时打开使用 Apache POI 创建的文档时出错 -> 在最新版本的 Excel 中使用使用 Apache POI 生成的条形图打开工作簿时出错 -> 从头开始使用 APACHE POI 和 Java 在 powerpoint 中创建图表

好像是这样的:

版本 4.1.2 的 Apache POI 决定将数字格式设置设置为默认类别轴。但它设置了一个空字符串作为数字格式代码。Microsoft Office 2021 及以下版本具有足够的容忍度,可以忽略该空字符串数字格式。Microsoft Office 365 没有那么宽容。

不清楚为什么,在所有事情中,类别轴默认具有该设置。值轴没有。

但要使其再次工作,必须修复不正确的数字格式设置。

在上面的代码中是类别轴。那是文本而不是数字。所以数字格式应该是 ,即文本。是值轴。如果设置,这可能具有数字格式。bottomAxis@leftAxis#,##0.00

因此,对上面代码的更改:

...
   //repair axes number format settings
   if (bottomAxis.hasNumberFormat()) bottomAxis.setNumberFormat("@");
   if (leftAxis.hasNumberFormat()) leftAxis.setNumberFormat("#,##0.00");
...

评论

0赞 Thomas HG 11/7/2023
哇!今天花了一整天的时间在谷歌上搜索、测试、修补......这解决了它。谢谢你,你是明星!