java - 如何更改 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);
}
谢谢您的帮助!
解决方案
要满足这些要求,需要了解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});
}
}
推荐阅读
- angular - Ionic 4 离子含量滚动到底部
- database - 在 Vertica 中完成 Copycluster 所需的时间?
- excel - 如何在 excel 2010 中按时间安排在应用程序之前终止 vba 脚本
- typescript - Azure Devops - 通过用户名获取用户的 IdentityRef
- c++ - 当向量有 6 个元素(C++、向量、循环)时,程序打印异常数字
- scala - scalaz ZIO中IO和UIO的区别
- typescript - 获取类的所有可用属性
- reactjs - 远程登录redux reducer?
- java - Spring Security 不允许资源并且在登录浏览器后只显示一个 css 文件?
- java - 我的应用程序在屏幕解锁后无法启动