如何设置饼图日期标签的字体大小 - 下面是代码 - 饼图部分内显示的数字非常小,难以阅读。我能够调整图例和图表标题字体,但无法调整实际饼图值显示的值。
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, startColumn, 0, endColumn, 13);
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleText(ChartTitle);
chart.getTitle().getBody().getParagraph(0).addDefaultRunProperties().setFontSize(17d);
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.RIGHT);
XDDFTextBody legendTextBody = new XDDFTextBody(legend);
legendTextBody.getXmlObject().addNewBodyPr();
legendTextBody.addNewParagraph().addDefaultRunProperties().setFontSize(14d);
legend.setTextBody(legendTextBody);
ArrayList<String> chartKeys = new ArrayList<String>();
ArrayList<Integer> chartValues = new ArrayList<Integer>();
Iterator hmIterator = map.entrySet().iterator();
while (hmIterator.hasNext()) {
Map.Entry mapElement
= (Map.Entry)hmIterator.next();
chartKeys.add(mapElement.getKey().toString());
chartValues.add((Integer)mapElement.getValue());
}
XDDFDataSource<String> cat = XDDFDataSourcesFactory.fromArray(chartKeys.toArray(new String[chartKeys.size()]));
XDDFDataSource<Integer> val = XDDFDataSourcesFactory.fromArray(chartValues.toArray(new Integer[chartValues.size()]));
XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
data.setVaryColors(true);
XDDFChartData.Series series = data.addSeries(cat, (XDDFNumericalDataSource<? extends Number>) val);
series.setTitle(chartHeader, null);
if (!chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).isSetDLbls()) {
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();
}
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowVal().setVal(true);
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowBubbleSize().setVal(true);
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false);
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowCatName().setVal(false);
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowPercent().setVal(false);
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowLegendKey().setVal(false);
chart.plot(data);
到目前为止,Apache POI 并未提供 Microsoft Office 提供的所有功能。 所以这个问题主要是:“如何在其高级类中做 Apache POI 未提供的事情?
答案是:有一些低级别的
org.openxmlformats.schemas.*
类是使用 XMLBeans 从 Microsoft 的 XSD 文件创建的。这些类包含 Microsoft 在其 XSD 中描述的所有内容。
如何使用低级
org.openxmlformats.schemas..*
课程?
不幸的是,没有在线可用的 API 文档。但我们需要这个。因此,我们需要下载所使用的
ooxml-schemas-*.jar
(最高 Apache PPOI 4)或 poi-ooxml-full jar
(自 Apache POI 5)的源代码。然后我们可以使用 javadoc
创建 API 文档。
所有 Office Open XML 文件,以及
*.xlsx
,都只是 ZIP 存档。因此,可以使用 ZIP 应用程序解压缩 *.xlsx
文件(例如 7-Zip 可以做到这一点)。然后我们就可以看看内部结构了。
当 Apache POI 的高级类缺乏对某些内容的支持时,要了解如何处理
*.xlsx
中的图表,请执行以下操作:
使用 Apache POI 提供的功能创建一个具有图表的
*.xlsx
。
然后解压该
*.xlsx
并显示xl/chart/chart*.xml
的内容。然后在 Excel GUI 中打开 *.xlsx
并执行您想要执行的其他操作。然后保存。然后解压该*.xlsx
并显示xl/chart/chart*.xml
的内容。现在比较 XML 中发生的变化。现在需要使用代码重新创建这些更改。
首先尝试了解
org.openxmlformats.schemas.drawingml.x2006.chart.*
需要什么课程。在 XML 中,大多数元素都是ComplexT类型。因此,如果您在 XML 中找到元素 chart
,则对应的类是 CTChart
。 XML 元素 plotArea
是 CTPlotArea
。 XML pieChart
是 CTPieChart
等等。
了解这一点并使用 javadoc 创建 API 文档后,应该能够弄清楚使用哪些类的哪些方法来创建所需的内容。
针对您当前增加数据标签字体大小的具体要求:
解压当前代码创建的
*.xlsx
并显示xl/chart/chart*.xml
的内容。你会发现类似的东西
<c:dLbls>
<c:showLegendKey val="false"/>
<c:showVal val="true"/>
<c:showCatName val="false"/>
<c:showSerName val="false"/>
<c:showPercent val="false"/>
<c:showBubbleSize val="true"/>
</c:dLbls>
用于数据标签。
然后在 Excel GUI 中打开
*.xlsx
并执行您想要执行的其他操作。例如,将数据标签的字体大小增加到 16pt。然后保存。然后解压该*.xlsx
并显示xl/chart/chart*.xml
的内容。你会发现类似的东西
<c:dLbls>
<c:txPr>
<a:bodyPr >...</a:bodyPr>
<a:p>
<a:pPr>
<a:defRPr sz="1600"/>
</a:pPr>
</a:p>
</c:txPr>
<c:showLegendKey val="0"/>
...
</c:dLbls>
用于数据标签。
现在比较 XML 中发生的变化:
数据标签 (
dLbls
) 现在具有文本属性 (txPr
)。文本属性具有正文属性 (bodyPr
)。并且文本属性有一个段落p
。该段落具有段落属性 (pPr
)。段落属性已定义运行属性 (defRPr
),并且设置了 1600
的大小。
现在需要使用代码重新创建这些更改。
...
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewTxPr();
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getTxPr().addNewBodyPr();
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getTxPr().addNewP();
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getTxPr().getPArray(0).addNewPPr();
chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getTxPr().getPArray(0).getPPr().addNewDefRPr().setSz(1600);
...