首页 > 解决方案 > 如何更改 barChart ApachePoi 中文本的颜色

问题描述

我的问题是我需要更改条形图中文本/字体的颜色。我所说的文字是指印在特定条上的值(最上面的 2 个系列)(见图 - 红色圆圈)。为了更明显,我想将颜色设置为白色。

我也需要他们大胆。

我怎样才能做到这一点?(我试图谷歌,但找不到任何东西,这将引导我找到解决方案)

在此处输入图像描述

为了更多地了解我的代码,这就是我设置条形背景颜色的方式:

    private void setColorsForMainChart(XSLFChart chart) {
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(0).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 210, (byte) 38, (byte) 48});
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(1).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 81, (byte) 174, (byte) 48});
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(2).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 113, (byte) 238, (byte) 50});
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(3).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 192, (byte) 192, (byte) 192});
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(4).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 127, (byte) 127, (byte) 127});
        chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(5).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 64, (byte) 64, (byte) 64});
    }

我的图表是这样创建的:

private void addBarChart(XSLFChart chart, int numOfPoints, List<Double[]> values, XDDFDataSource<String> categoriesData) {
        int subBarLevel = 1;
        List<XDDFNumericalDataSource<Double>> valuesData = getValuesData(chart, values, numOfPoints, subBarLevel);

        // create axis
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        bottomAxis.getOrAddTextProperties().setFontSize(7.0);
        bottomAxis.getOrAddTextProperties().setBold(true);
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.getOrAddTextProperties().setFontSize(9.0);
        leftAxis.getOrAddTextProperties().setBold(true);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
        leftAxis.setMaximum(getYAxisMaximum());
        leftAxis.setMinimum(0);
        // Set AxisCrossBetween, so the left axis crosses the category axis between the categories.
        // Else first and last category is exactly on cross points and the bars are only half visible.
        leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

        // create chart data
        XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
        ((XDDFBarChartData) data).setBarDirection(BarDirection.COL);
        // stacked bar chart
        ((XDDFBarChartData) data).setBarGrouping(BarGrouping.STACKED);
        ((XDDFBarChartData) data).setOverlap((byte) 100);

        // create series
        createSeriesBarChart(chart, valuesData, data, categoriesData);

        // plot chart data
        chart.plot(data);

        // add data labels
        for (int s = 0; s < valuesData.size(); s++) {
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).addNewDLbls();
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls()
                    .addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.CTR);

            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewNumFmt();
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getNumFmt()
                    .setSourceLinked(false);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getNumFmt()
                    .setFormatCode("0;-0;");

            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowVal().setVal(true);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowLegendKey().setVal(false);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowCatName().setVal(false);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowSerName().setVal(false);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowPercent().setVal(false);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewShowBubbleSize().setVal(false);
        }

        setColorsForMainChart(chart);
    }

谢谢您的帮助!

标签: javaapache-poipowerpoint

解决方案


要满足这些要求,需要了解Office Open XML. 但至少应该知道正确的术语。您要更改的是某些系列的数据标签的字体。您的代码为此循环中的每个系列创建数据标签:

// add data labels
for (int s = 0; s < valuesData.size(); s++) {
 ...
}

代码似乎来自这个答案:Show SUM Value above Stacked bar with Apache poi

如何走得更远?使用您的代码创建图表。然后/ppt/charts/chart1.xml*.pptx ZIP存档中打开。PowerPoint现在使用并保存更改所需的内容。现在再次/ppt/charts/chart1.xml*.pptx ZIP存档中打开并比较更改的内容。

如果您更改了其中一个系列的数据标签的字体,那么您会发现XML

<c:txPr>
 <a:bodyPr/>
 <a:p>
  <a:pPr>
   <a:defRPr b="true">
    <a:solidFill>
     <a:srgbClr val="FFFFFF"/>
    </a:solidFill>
   </a:defRPr>
  </a:pPr>
 </a:p>
</c:txPr>

<c:dLbls>...</c:dLbls>在该系列的标签之间添加。

现在需要使用apache poi.

以下示例更改第四系列数据标签的字体。它适合我在使用 Apache poi 在 Stacked bar 上方显示 SUM Value的答案中的完整示例。

   // add data labels
   for (int s = 0 ; s < valuesData.size(); s++) {
    ...
    
    if (s==3) {
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().addNewTxPr();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().addNewBodyPr();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().addNewP();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().getPArray(0).addNewPPr();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().getPArray(0).getPPr().addNewDefRPr();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().getPArray(0).getPPr().getDefRPr().setB(true);
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().getPArray(0).getPPr().getDefRPr().addNewSolidFill();
     chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(s).getDLbls().getTxPr().getPArray(0).getPPr().getDefRPr().getSolidFill().addNewSrgbClr()
      .setVal(new byte[]{(byte) 255, (byte) 255, (byte) 255});
    }

   }

推荐阅读