【问题标题】:Apache POI scatter chart creationApache POI 散点图创建
【发布时间】:2018-10-11 12:20:04
【问题描述】:

目前正在使用 POI 生成散点图,但是图表很奇怪: 左上角是使用我的代码生成的,另一个是在 Excel 中手动生成的。 它们都是“带有直线和标记的散点图”类型,但是生成的图表由于某种原因显示了曲线。另一个问题是每个数据点都在图例中单独列出,并被赋予了另一种颜色。

public void GenerateChart(XSSFSheet sheet) {
    XSSFDrawing drawing = sheet.createDrawingPatriarch();
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);

    XSSFChart chart = drawing.createChart(anchor);
    XSSFChartLegend legend = chart.getOrCreateLegend();
    legend.setPosition(LegendPosition.TOP_RIGHT);

    XSSFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
    XSSFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
    leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

    CellRangeAddress crXData = new CellRangeAddress(1, sheet.getLastRowNum(), 0, 0);
    CellRangeAddress crYData = new CellRangeAddress(1, sheet.getLastRowNum(), 1, 1);
    CellReference crTitle = new CellReference(0,1);
    Cell cell = sheet.getRow(crTitle.getRow()).getCell(crTitle.getCol());

    ChartDataSource<Number> dsXData = DataSources.fromNumericCellRange(sheet, crXData);
    ChartDataSource<Number> dsYData = DataSources.fromNumericCellRange(sheet, crYData);

    XSSFScatterChartData data = chart.getChartDataFactory().createScatterChartData();
    ScatterChartSeries seriesTitler = data.addSerie(dsXData, dsYData);

    seriesTitler.setTitle(cell.getStringCellValue());
    chart.plot(data, bottomAxis, leftAxis);
}

使用 Apache POI 3.17 文档here 显示XSSFScatterChartData 和其他文件已被弃用,我应该改用XDDFScatterChartData。但是我不知道从哪里得到 .jar 来使用它。我假设它处于测试阶段?

我想要做的是生成类似于图像右侧图表的东西,即手动创建的图表。由于允许创建图表的 POI 似乎是一个相对较新的事物,因此我一直无法找到任何线索。有人知道诀窍吗?

【问题讨论】:

    标签: java excel graph charts apache-poi


    【解决方案1】:

    问题是在较新的Excel 版本中更改了Excel 图表的默认值。

    散点图中有一个平滑线条的设置。 Apache poi 没有设置这个。但现在在较新的 Excelversions 中,如果未设置此选项,则默认为 true。

    还有一个设置可以改变每个数据点的颜色。 apache poi 也没有设置这个。但现在在较新的 Excelversions 中,如果未设置此选项,则默认为 true。

    所以我们需要根据需要将这两个选项都设置为 false:

    ...
      chart.plot(data, bottomAxis, leftAxis);
    
      //set properties of first scatter chart data series to not smooth the line:
      ((XSSFChart)chart).getCTChart().getPlotArea().getScatterChartArray(0).getSerArray(0)
       .addNewSmooth().setVal(false);
    
      //set properties of first scatter chart to not vary the colors:
      ((XSSFChart)chart).getCTChart().getPlotArea().getScatterChartArray(0)
       .addNewVaryColors().setVal(false);
    ...
    

    很遗憾,https://poi.apache.org/apidocs/ 不是最新稳定版本的 POI API 文档,而是当前“夜间构建”的 POI API 文档。因此,要使用XDDF 而不是XSSF,需要使用夜间构建,这当然是不是稳定版本,应该在生产代码中使用。

    【讨论】:

    • 关闭Variable colours选项后,我们可以设置系列中标记的颜色吗?我只能看到设置标记样式而不是颜色的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多