Apache POI散点图创建

时间:2018-05-01 12:55:17

标签: java excel graph charts apache-poi

目前使用POI生成散点图,但图表显得很奇怪: charts topleft one是使用我的代码生成的,另一个是在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允许创建图表似乎是一个相对较新的东西,我无法找到任何线索。有人知道这个伎俩吗?

1 个答案:

答案 0 :(得分:3)

较新的Excel版本中Excel图表的问题已更改为默认设置。

有一个设置可以在散点图中平滑线条。 Apache poi没有设置此内容。但现在在较新的Excel版本中,如果未设置此选项,则默认为true。

还有一个设置可以改变每个数据点的颜色。 apache poi也没有设置此项。但现在在较新的Excel版本中,如果未设置,此选项默认为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文档,但是对于当前的“Nightly Build”。因此,使用XDDF代替XSSF需要使用夜间构建,当然稳定版本应该在生产代码中使用。