apache poi:如何使用bar和line创建图表?

时间:2017-07-26 19:39:28

标签: apache-poi bar-chart linechart

是否可以在apache poi中创建一个包含bar和line的图表?您可以找到示例here

如果是,请提供示例代码以实现此目的吗?

期待您的回音。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是我找到的解决方案。 遗憾的是,我无法更改折线图的轴。但是您可以在文件上手动更改此项。当您打开它时,使用右键单击行系列顶部并选择“格式化数据系列”,您可以先将其更改为主轴,然后再将辅助轴更改,这将获得图表完美!我真的不知道如何解决这个问题,如果你发现请与我分享!

你将需要jar ooxml-schemas-1.3.jar。 它的全部有15MB。 https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas/1.3

我希望它有所帮助!

    XSSFWorkbook workbook=new XSSFWorkbook();
    XSSFSheet chartdisplay=workbook.createSheet("ChartDisplay")
    XSSFDrawing drawing=chartdisplay.createDrawingPatriarch();
    ClientAnchor anchor=drawing.createAnchor(0,0,0,0,5,5,13,13);
    Chart chart=drawing.createChart(anchor);

    CTChart ctChart=((XSSFChart)chart).getCTChart();
    CTPlotArea ctPlotArea=ctChart.getPlotArea();
    //Bar Chart
    CTBarChart ctBarChart=ctPlotArea.addNewBarChart();
    CTBoolean ctBoolean=ctBarChart.addNewVaryColors();
    ctBoolean.setVal(false);
    ctBarChart.addNewBarDir().setVal(STBarDir.COL);
    CTBarSer ctBarSer=ctBarChart.addNewSer();
    CTSerTx ctSerTx=ctBarSer.addNewTx();
    CTStrRef ctStrRef=ctSerTx.addNewStrRef();
    ctStrRef.setF("\"BarSeriesName\"");
    //Labels For Bar Chart

    ctBarSer.addNewIdx().setVal(0); //0 = Color Blue
    CTAxDataSource ctAxDataSource=ctBarSer.addNewCat();
    ctStrRef=ctAxDataSource.addNewStrRef();
    String labelsRefer="ChartDisplay!B2:B7";//Excel Range where the Labels Are
    ctStrRef.setF(labelsRefer);
    //Values For Bar Chart
    CTNumDataSource ctNumDataSource=ctBarSer.addNewVal();
    CTNumRef ctNumRef=ctNumDataSource.addNewNumRef();
    String valuesRefer="ChartDisplay!C2:C7";//Excel range where values for barChart are
    ctNumRef.setF(valuesRefer);
    ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0,0,0});
    // Axis
    ctBarChart.addNewAxId().setVal(123456);
    ctBarChart.addNewAxId().setVal(123457);
    //cat axis
    CTCatAx ctCatAx=ctPlotArea.addNewCatAx();
    ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
    CTScaling ctScaling=ctCatAx.addNewScaling();
    ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
    ctCatAx.addNewDelete().setVal(false);
    ctCatAx.addNewAxPos().setVal(STAxPos.L);
    ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
    ctCatAx.addNewMinorTickMark().setVal(STTickMark.NONE);
    ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

    //val Left Axis
    CTValAx ctValAx1=ctPlotArea.addNewValAx();
    ctValAx1.addNewAxId().setVal(123457); //id of the val axis
    ctScaling=ctValAx1.addNewScaling();
    ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
    ctValAx1.addNewDelete().setVal(false);
    ctValAx1.addNewAxPos().setVal(STAxPos.L);
    ctValAx1.addNewCrossAx().setVal(123456); //id of the cat axis
    ctValAx1.addNewMinorTickMark().setVal(STTickMark.NONE);
    ctValAx1.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
    ctValAx1.addNewMajorGridlines();

    // =======Line Chart
    //val Right Axis
    CTLineChart ctLineChart=ctPlotArea.addNewLineChart();
    CTBoolean ctBooleanLine=ctLineChart.addNewVaryColors();
    ctBooleanLine.setVal(false);
    CTLineSer ctLineSer=ctLineChart.addNewSer();
    CTSerTx ctSerTx1=ctLineSer.addNewTx();
    CTStrRef ctStrRef1=ctSerTx1.addNewStrRef();
    ctStrRef1.setF("\"LineSeriesName\"");
    ctLineSer.addNewIdx().setVal(2); //2= Color Grey
    CTAxDataSource ctAxDataSource1=ctLineSer.addNewCat();
    ctStrRef1=ctAxDataSource1.addNewStrRef();
    ctStrRef1.setF(labelsRefer);
    ctLineSer.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0,0,0});

    String values2Refer="ChartDisplay!D2:D7"; //Excel Range Where Values for Line Values are
    CTNumDataSource ctNumDataSource1=ctLineSer.addNewVal();
    CTNumRef ctNumRef1=ctNumDataSource1.addNewNumRef();
    ctNumRef1.setF(values2Refer);

    //Axis
    ctLineChart.addNewAxId().setVal(1234);//id of the cat axis
    ctLineChart.addNewAxId().setVal(12345);

    CTCatAx ctCatAx1=ctPlotArea.addNewCatAx();
    ctCatAx1.addNewAxId().setVal(1234);// id of the cat Axis
    ctScaling=ctCatAx1.addNewScaling();
    ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
    ctCatAx1.addNewDelete().setVal(true);
    ctCatAx1.addNewAxPos().setVal(STAxPos.R);
    ctCatAx1.addNewCrossAx().setVal(12345); //id of the val axis
    CTBoolean ctBoolean1=ctCatAx1.addNewAuto();


    CTValAx ctValAx=ctPlotArea.addNewValAx();
    ctValAx.addNewAxId().setVal(12345); //id of the val axis
    ctScaling=ctValAx.addNewScaling();
    ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
    ctValAx.addNewDelete().setVal(false);
    ctValAx.addNewAxPos().setVal(STAxPos.R);
    ctValAx.addNewCrossAx().setVal(1234); //id of the cat axis
    ctValAx.addNewMinorTickMark().setVal(STTickMark.NONE);
    ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

    //Legend
    CTLegend ctLegend=ctChart.addNewLegend();
    ctLegend.addNewLegendPos().setVal(STLegendPos.B);
    ctLegend.addNewOverlay().setVal(false);