Java 如何更改条形图ApachePoi中文本的颜色

Java 如何更改条形图ApachePoi中文本的颜色,java,apache-poi,powerpoint,Java,Apache Poi,Powerpoint,我的问题是我需要更改条形图中文本/字体的颜色。我所说的文本是指打印在特定条上的值(最上面的两个系列)(参见图-红色圆圈)。为了更直观,我想将颜色设置为白色 我也需要他们大胆 我怎样才能做到这一点? (我试着用谷歌搜索,但找不到任何东西,这将引导我找到解决方案) 为了更全面地了解我的代码,以下是我设置条形图背景颜色的方式: private void setColorsForMainChart(XSLFChart图表){ chart.getCTChart().getPlotArea().getBa

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

我也需要他们大胆

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

为了更全面地了解我的代码,以下是我设置条形图背景颜色的方式:

private void setColorsForMainChart(XSLFChart图表){
chart.getCTChart().getPlotArea().getBarChartArray(0).getSerray(0).addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)210,(字节)38,(字节)48});
chart.getCTChart().getPlotArea().getBarChartArray(0.getSerray(1.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)81,(字节)174,(字节)48});
chart.getCTChart().getPlotArea().getBarChartArray(0.getSerray(2.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)113,(字节)238,(字节)50});
chart.getCTChart().getPlotArea().getBarChartArray(0.GetSerray(3.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)192,(字节)192,(字节)192});
chart.getCTChart().getPlotArea().getBarChartArray(0.getSerray(4.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)127,(字节)127,(字节)127});
chart.getCTChart().getPlotArea().getBarChartArray(0.GetSerray(5.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{(字节)64,(字节)64,(字节)64});
}
我的图表是这样创建的:

private void addBarChart(XSLFChart图表、int numOfPoints、列表值、XDDFDataSource分类数据){
int subBarLevel=1;
列表值数据=getValuesData(图表、值、点数、子级别);
//创建轴
XDDFCategoryAxis bottomAxis=chart.createCategoryAxis(AxisPosition.BOTTOM);
bottomAxis.getOradTextProperties().setFontSize(7.0);
bottomAxis.getOradTextProperties().setBold(true);
XDDFValueAxis leftAxis=chart.createValueAxis(AxisPosition.LEFT);
leftAxis.GetOradTextProperties().setFontSize(9.0);
leftAxis.getOradTextProperties().setBold(true);
leftAxis.setcrosss(axiscrosss.AUTO_ZERO);
setMaximum(getYAxisMaximum());
leftAxis.setMinimum(0);
//设置AxisCrossBetween,使左轴与类别之间的类别轴相交。
//否则,第一个和最后一个类别正好位于交叉点上,而条形图仅显示一半。
leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
//创建图表数据
XDDFChartData data=chart.createData(ChartTypes.BAR、bottomAxis、leftAxis);
((XDDFBarChartData)数据)设置方向(BarDirection.COL);
//堆积条形图
((XDDFBarChartData)数据)。SetBarGroup(BarGroup.STACKED);
((XDDFBarChartData)数据).setOverlap((字节)100);
//创建系列
createSeriesBarChart(图表、值数据、数据、分类数据);
//绘图图数据
图表、绘图(数据);
//添加数据标签
对于(int s=0;s

谢谢你的帮助

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

// add data labels
for (int s = 0; s < valuesData.size(); s++) {
 ...
}
在该系列的标签之间添加了

现在需要使用ApachePOI来重建它

下面的示例更改第四个系列的数据标签的字体。它符合我在年回答中的完整示例

//添加数据标签
对于(int s=0;s<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>
   // 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});
    }

   }