加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何更改apache poi生成的图表不使用平滑线条并将空单元

发布时间:2020-12-15 04:26:03 所属栏目:Java 来源:网络整理
导读:我使用的是POI 3.12-beta1,并且代码可以在图例中创建包含多个数据集和命名系列的折线图.但是,poi中折线图的默认设置会生成一条已在数据点上平滑的线.空值也被绘制为0,但我们希望这些线在第一列停止,其中有一个空单元格. 一旦在xlsx文件中呈现并更改这些设置,
我使用的是POI 3.12-beta1,并且代码可以在图例中创建包含多个数据集和命名系列的折线图.但是,poi中折线图的默认设置会生成一条已在数据点上平滑的线.空值也被绘制为0,但我们希望这些线在第一列停止,其中有一个空单元格.

一旦在xlsx文件中呈现并更改这些设置,我就可以进入图表属性,但我们需要使用这些设置渲染xlsx.我在可用的API中找不到任何更改这些设置的内容.

我使用此示例类作为下面代码的起点
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 });

解决方法

感谢Etienne的代码将空白设置为差距.我从POI开发人员那里获得了帮助,这是解决原始问题中提到的两个问题的解决方案.

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);
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读