Apache POI 图表数据标签字体大小

问题描述 投票:0回答:1

如何设置饼图日期标签的字体大小 - 下面是代码 - 饼图部分内显示的数字非常小,难以阅读。我能够调整图例和图表标题字体,但无法调整实际饼图值显示的值。

    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);       

charts apache-poi pie-chart
1个回答
0
投票

到目前为止,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);  
...
© www.soinside.com 2019 - 2024. All rights reserved.