如何使用POI和org.openxmlformats在Java中为PPT中的条形图添加数据标签

How to add Data Label for a Bar chart in PPT using POI and org.openxmlformats in Java

我正在制作一个幻灯片演示文稿。每张幻灯片都有一个图表(条形图或饼图)。我正在使用 Apache POI 库和 org.openxmlformats.

我可以为图表绘制数据 table,但无法为图表绘制数据标签。

实际输出-

请在下面找到没有数据标签的生成图 - 预期输出-

代码-

CTChartSpace chartSpace = myXSLFChartShape.getMyXSLFChart().getChartSpace();
    CTChart cTChart = chartSpace.addNewChart();
    CTPlotArea cTPlotArea = cTChart.addNewPlotArea();
    CTBarChart cTBarChart = cTPlotArea.addNewBarChart();
    cTBarChart.addNewVaryColors().setVal(true);
    cTBarChart.addNewBarDir().setVal(STBarDir.COL);
    //int c = 0;
    for (int r = 0; r < 2; r++) {
        //c=1;
        CTBarSer cTBarSer = cTBarChart.addNewSer();
        CTStrRef cTStrRef = cTBarSer.addNewTx().addNewStrRef();
        cTStrRef.setF("Label " + r);
        cTStrRef.addNewStrCache().addNewPtCount().setVal(1);
        CTStrVal cTStrVal = cTStrRef.getStrCache().addNewPt();
        cTStrVal.setIdx(0);
        cTStrVal.setV("Val" + r);

        cTBarSer.addNewIdx().setVal(r);
        cTStrRef = cTBarSer.addNewCat().addNewStrRef();
        cTStrRef.setF("Categories");
        cTStrRef.addNewStrCache().addNewPtCount().setVal(1);

        for (int c = 0; c < 2; c++) {
            cTStrVal = cTStrRef.getStrCache().addNewPt();
            cTStrVal.setIdx(c);             
            cTStrVal.setV("Cat" + c);
        }

        CTNumRef cTNumRef = cTBarSer.addNewVal().addNewNumRef();
        cTNumRef.setF("" + 0);
        cTNumRef.addNewNumCache().addNewPtCount().setVal(1);
        for (int c = 0; c < 2; c++) {
            CTNumVal cTNumVal = cTNumRef.getNumCache().addNewPt();
            cTNumVal.setIdx(c);
            cTNumVal.setV("" + (10 * (c + 1)));
        }
            //c++;
    }

    // telling the BarChart that it has axes and giving them Ids
    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.B);
    cTCatAx.addNewCrossAx().setVal(123457); // id of the val axis
    cTCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

    // val axis
    CTValAx cTValAx = cTPlotArea.addNewValAx();
    cTValAx.addNewAxId().setVal(123457); // id of the val axis
    cTScaling = cTValAx.addNewScaling();
    cTScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
    cTValAx.addNewDelete().setVal(false);
    cTValAx.addNewAxPos().setVal(STAxPos.L);
    cTValAx.addNewCrossAx().setVal(123456); // id of the cat axis
    cTValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
    cTValAx.addNewDispUnits();
    // legend


    CTLegend cTLegend = cTChart.addNewLegend();
    cTLegend.addNewLegendPos().setVal(STLegendPos.R);

    CTDTable c = cTPlotArea.addNewDTable();
    c.addNewShowKeys();

如果有人能帮助我实现目标就好了。 提前致谢。

为 Openxmlformats 库添加数据标签可以通过 CTDLbls class 实现。找到下面的代码片段 -

        CTDLbls dLbls = cTBarChart.addNewDLbls();
        dLbls.addNewShowBubbleSize().setVal(false);
        dLbls.addNewShowLegendKey().setVal(false);
        dLbls.addNewShowCatName().setVal(false);
        dLbls.addNewShowSerName().setVal(false);
        dLbls.addNewShowPercent().setVal(false);
        dLbls.addNewShowVal().setVal(true);