首页 > 解决方案 > Pie Chart Apache POI (4.1.1) - 如何获取数据标签的数字格式为0,00

问题描述

我在互联网上进行了一些搜索(和代码检查),但似乎我找不到我要找的东西......

我做什么: 我正在一个工作正常的excel中创建一个饼图,除了百分比值显示为小数点后:

小数位数过多的饼图

我在生成的 Excel 中玩了一下,如果我能以编程方式访问“类别” - Numbers 属性会有所帮助: 图表应该是什么样子

在我的代码中,我已经尝试设置数字格式,这对我没有任何改变:

public void createPieChartInSheet(Workbook wb, XSSFDrawing drawing, String chartTitle, XSSFClientAnchor anchor, LinkedList<Triple<String, XDDFDataSource<String>, XDDFNumericalDataSource<Double>>> chartSeries, LinkedList<byte[]> colorScheme) {
    XSSFChart chart = drawing.createChart(anchor);
    chart.setTitleText(chartTitle);
    chart.setTitleOverlay(false);

    XDDFDataSource<String> cat = chartSeries.get(0).getMiddle();
    XDDFNumericalDataSource<Double> val = chartSeries.get(0).getRight();

    XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
    Series series = data.addSeries(cat, val);
    series.setTitle(chartSeries.get(0).getLeft(), null);

    // Add data labels
    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().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.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewNumFmt().setFormatCode("0,00");

    setPieChartColors(colorScheme, chart, series);
    chart.plot(data);
}

我什至在寻找正确的东西吗?任何帮助表示赞赏 - 谢谢!

标签: javaapache-poipie-chart

解决方案


Excel图表从存储值的单元格的数字格式中获取其数据标签数字格式。这称为“源链接”,是默认设置。因此,只需使用您想要的数字格式来格式化这些单元格。

但是,如果您想让数据标签具有特殊的其他数字格式,则需要在NumFmt元素中添加一个元素DLbls。你已经这样做了。但这NumFmt一定不能与源链接。而且它必须有它自己的FormatCode,它总是en_USXML. 本地化是由Excel GUI而不是在源中完成的XML。所以它必须0.00在你的情况下,因为点是小数分隔符,而逗号是千位分隔符en_US。但是如果你想让它具有两个十进制数字的默认十进制数字格式,它必须是#,##0.00.

更改您的代码如下:

...
    // Add data labels
    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().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.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewNumFmt().setFormatCode("0,00");
    chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewNumFmt();
    chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getNumFmt().setSourceLinked(false);
    chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().getNumFmt().setFormatCode("#,##0.00");
...

这对我有用,并导致数据标记为#.##0,00我的 German 中的数字格式Excel,这是具有两个十进制数字的默认十进制数字格式。


推荐阅读