如何创建Apache POI堆叠条形图

时间:2016-12-22 16:33:44

标签: apache-poi stacked-chart

我想使用apache poi库创建“堆积条形图”。需要一些文档。

     row1 = worksheet.createRow(r);
      row['data'].flatten.each_with_index do |data, index|
        cell = row1.createCell(index);
        cell.setCellValue(data);
      end
    drawing = worksheet.createDrawingPatriarch();
    anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 8, 20);

    chart = drawing.createChart(anchor);
    ctChart = chart.getCTChart();
    ctPlotArea = ctChart.getPlotArea();
    ctBarChart = ctPlotArea.addNewBarChart();

    ctBoolean = ctBarChart.addNewVaryColors();
    ctBoolean.setVal(true);
    ctBarChart.addNewBarDir().setVal(STBarDir.BAR);
    ctBarChart.addNewGrouping().setVal(STBarGrouping.STACKED);

       ctBarSer = ctBarChart.addNewSer();
       ctSerTx = ctBarSer.addNewTx();
       ctStrRef = ctSerTx.addNewStrRef();
       ctStrRef.setF("Sheet1!$A$#{r+1}");
       ctBarSer.addNewIdx().setVal(r+1);  
       cttAxDataSource = ctBarSer.addNewCat();
       ctStrRef = cttAxDataSource.addNewStrRef();
       length = row['data'].flatten.length
       ctStrRef.setF("Sheet1!$B$#{r+1}:$#{CellReference.convertNumToColString(length-1)}$#{r + 1}"); 
       ctNumDataSource = ctBarSer.addNewVal();
       ctNumRef = ctNumDataSource.addNewNumRef();
       ctNumRef.setF("Sheet1!$B$#{r+1}:$#{CellReference.convertNumToColString(length-1)}$#{r+1}");

       ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal([0,0,0]);   

使用上面的代码我得到条形图,但需要转换为堆积条形图。

{{3}}

1 个答案:

答案 0 :(得分:2)

虽然我无法准确地告诉您使图表工作的神奇咒语,但我可以帮助您解决问题。

如果POI不支持您要创建的图表类型。您将不得不手动创建它。看起来你有一个良好的开端。您可以在http://www.ecma-international.org/publications/standards/Ecma-376.htm找到规范文档。 POI使用规范的第1版。

虽然这些文档非常好,但您可能需要一些帮助来确定如何构建XML。我的方法是使用Excel或Word创建一个简单的文档,然后将保存的文档重命名为*.zip。现在,您可以使用Notepad ++或其他一些查看器检查xml包。

一旦您使用POI生成了某些内容,您还可以以类似的方式查看生成的XML,以查看结果与预期不符的差异。

相关问题