目前使用POI生成散点图,但图表显得很奇怪: 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允许创建图表似乎是一个相对较新的东西,我无法找到任何线索。有人知道这个伎俩吗?
答案 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
需要使用夜间构建,当然不稳定版本应该在生产代码中使用。