Java – how to change the chart generated by Apache POI to not use smooth lines and display empty cells as gaps?

I use poi 3.12-beta 1, and the code can create a line chart containing multiple data sets and named Series in the legend However, the default setting of POI polyline chart will generate a smooth line on the data point Null values are also plotted as 0, but we want these lines to stop in the first column with an empty cell

Once I render and change these settings in the xlsx file, I can enter the chart properties, but we need to render xlsx with these settings I can't find anything to change these settings in the available APIs

I use this sample class as a starting point for the following code http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/LineChart.java

Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0,17,18,30);
        Chart chart = drawing.createChart(anchor);
        ChartLegend legend = chart.getOrCreateLegend();
        legend.setPosition(LegendPosition.RIGHT);
        LineChartData data = chart.getChartDataFactory().createLineChartData();
        ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
        ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

        int row = 2;
        int startCol = 3;
        int endCol = 17;
        boolean abs = false;
        ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet,new CellRangeAddress(row,row,startCol,endCol));

        row = 10;
        int seriesCol = 0;
        ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet,endCol));
        LineChartSerie ser1 = data.addSerie(xs,ys1);
        ser1.setTitle(new CellReference(sheet.getSheetName(),seriesCol,abs,abs));

        row = 11;
        ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet,endCol));
        LineChartSerie ser2 = data.addSerie(xs,ys2);
        ser2.setTitle(new CellReference(sheet.getSheetName(),abs));

        row = 12;
        ChartDataSource<Number> ys3 = DataSources.fromNumericCellRange(sheet,endCol));
        LineChartSerie ser3 = data.addSerie(xs,ys3);
        ser3.setTitle(new CellReference(sheet.getSheetName(),abs));

        chart.plot(data,new ChartAxis[] { bottomAxis,leftAxis });

Solution

Thanks to Etienne's code for setting the blank to the gap I got help from POI developers, which is the solution to the two problems mentioned in the original problem

XSSFChart chart = (XSSFChart)drawing.createChart(anchor);

    // this will set blank values as gaps in the chart so you 
    // can accurately plot data series of different lengths
    CTDispBlanksAs disp = CTDispBlanksAs.Factory.newInstance();
    disp.setVal(STDispBlanksAs.GAP);
    chart.getCTChart().setDispBlanksAs(disp);


    // setup chart,axes,data series,etc


    chart.plot(data,leftAxis });

    // this must occur after the call to chart.plot above
    CTPlotArea plotArea = chart.getCTChart().getPlotArea();
    for (CTLineChart ch : plotArea.getLineChartList()) {
        for (CTLineSer ser : ch.getSerList()) {
            CTBoolean ctBool = CTBoolean.Factory.newInstance();
            ctBool.setVal(false);
            ser.setSmooth(ctBool);
        }
    }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>