Apache POI add a Series name into LineChart

2020-01-29 17:45发布

I am creating a LineChart using Apache POI in Excel document. As far as I've managed to achieve is in the below image:

enter image description here

I wrote the code using examples from Apache's svn, so my current approach looks like this:

Drawing drawing = question.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 8, 14, 18);

Chart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend();
legend.setPosition(LegendPosition.TOP_RIGHT);

LineChartData data = chart.getChartDataFactory().createLineChartData();

ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
bottomAxis.setCrosses(AxisCrosses.AUTO_ZERO);
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

List<ReportQuestionModel> questionModels = groupModel.getQuestionModels();
for (ReportQuestionModel questionModel : questionModels) {

    List<ReportOptionModel> optionModels = questionModel.getOptionModels();
    for (ReportOptionModel optionModel : optionModels) {
        rowNum++;

        XSSFRow optionRow = question.createRow(rowNum);

        XSSFCell optionsCell = optionRow.createCell(0);
        optionsCell.setCellValue(optionModel.getAnswerText());

        long count = optionModel.getCount();
        totalResponses += count;

        XSSFCell optionsCountCell = optionRow.createCell(1);
        optionsCountCell.setCellValue(count);

        XSSFCell optionsPercentageCell = optionRow.createCell(2);
        optionsPercentageCell.setCellValue(optionModel.getPercentage());
    }
}

ChartDataSource<Number> xs = DataSources.fromNumericCellRange(question, new CellRangeAddress(8, 8, 0, 1));
for (int i = 9; i <= rowNum; i ++) {
    ChartDataSource<Number> ys = DataSources.fromNumericCellRange(question, new CellRangeAddress(i, i, 0, 1));
    data.addSerie(xs, ys);
}
chart.plot(data, bottomAxis, leftAxis);

What I can't find is how to get default "Series 1", "Series 2", ..., "Series n" names to be taken from as my values from the columns, in this case from: "Answer options". And there doesn't seem to be any methods in the current API how to specify names of the series.

Can anybody assist me with this, please?

2条回答
我只想做你的唯一
2楼-- · 2020-01-29 18:26

It was pretty straight forward, just instead of using:

data.addSeries(xs, ys);

I had to be using:

LineChartSeries chartSeries = data.addSeries(xs, ys);
chartSeries.setTitle("My Title");

Didn't look at the API that using data.addSeries(xs, ys); returns a single LineChartSeries object onto which I can set a title.

查看更多
聊天终结者
3楼-- · 2020-01-29 18:47

From Apache POI version 3.16 onwards, use setTitleText("Title Name") instead. Also the correct class name is LineChartSeries not LineChartSerie. So, the above solution would look like:

LineChartSeries chartSeries = data.addSeries(xs,ys);
chartSeries.setTitleText("My Title");

for Apache POI 3.16 onwards.

查看更多
登录 后发表回答