使用 APACHE POI 和 Java 从头开始在 Powerpoint 中创建图表

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

我尝试使用以下帖子中的代码创建图表。 java 使用 APACHE POI 在 powerpoint 中创建图表

PPT 文件已创建,但当我访问它时,我收到一个窗口,要求我修复它。 有人可以帮助我了解这里发生了什么吗?

以下是参考代码:

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.*;
import org.apache.poi.xddf.usermodel.chart.*;

import java.awt.Rectangle;

public class CreatePowerPointXDDFChart {
    
 public static void main(String[] args) throws Exception {
  try (XMLSlideShow slideShow = new XMLSlideShow()) {
   
   // create a new empty slide
   XSLFSlide slide = slideShow.createSlide();
   
   // create chart
   XSLFChart chart = slideShow.createChart();
   chart.setTitleText("Test Chart");
   
   // set axis
   XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
   XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
   leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
   leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

   // define chart data for bar chart
   XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);

   // add chart categories (x-axis data)
   String[] categories = new String[] { "Category 1", "Category 2", "Category 3" };
   String categoryDataRange = chart.formatRange(new org.apache.poi.ss.util.CellRangeAddress(1, categories.length, 0, 0));
   XDDFCategoryDataSource categoryData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);

   // add chart values (y-axis data)
   Double[] values = new Double[] { 10.0, 20.0, 15.0 };
   String valuesDataRange = chart.formatRange(new org.apache.poi.ss.util.CellRangeAddress(1, values.length, 1, 1));
   XDDFNumericalDataSource<Double> valueData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange, 1);
   XDDFBarChartData bar = (XDDFBarChartData) data;
   bar.setBarDirection(BarDirection.BAR);

   // add series
   XDDFChartData.Series series = data.addSeries(categoryData, valueData);
   series.setTitle("Series 1", chart.setSheetTitle("Series 1", 1));
   
   // plot chart
   chart.plot(data);

   // set chart dimensions !!Units are EMU (English Metric Units)!!
   Rectangle chartDimensions = new Rectangle(
    100*Units.EMU_PER_POINT, 
    50*Units.EMU_PER_POINT, 
    400*Units.EMU_PER_POINT, 
    400*Units.EMU_PER_POINT);
   // add chart to slide
   slide.addChart(chart, chartDimensions);

   // Write the output to a file
   try (FileOutputStream fileOut = new FileOutputStream("./CreatePowerPointXDDFChart.pptx")) {
    slideShow.write(fileOut);
   }
  }
 }

}

我不知道在这里做什么。 @Axel Richter 你能帮忙解决这个问题吗?

java charts apache-poi
1个回答
0
投票

发现问题了。

由上述代码创建的

CreatePowerPointXDDFChart.pptx
可以使用 Microsoft Office 2021 正确打开。当使用 Apache POI 版本 4.1.0 创建时,它可以使用 Microsoft Office 365 正确打开。

问题是 Apache POI 从 4.1.2 版本开始决定默认将数字格式设置设置为类别轴。但它设置一个空字符串作为数字格式代码。 Microsoft Office 版本 2021 之前的版本具有足够的容忍度,可以忽略该空字符串数字格式。 Microsoft Office 365 就没那么宽容了。

不清楚为什么类别轴默认具有该设置。数值轴没有。

但要使其再次工作,必须修复不正确的数字格式设置。

在上面的代码中

bottomAxis
是类别轴。那是文本而不是数字。所以数字格式应该是
@
,也就是文本。
leftAxis
是一个值轴。如果设置的话,可以采用数字格式
#,##0.00

因此更改上面的代码:

...
   //repair axes number format settings
   if (bottomAxis.hasNumberFormat()) bottomAxis.setNumberFormat("@");
   if (leftAxis.hasNumberFormat()) leftAxis.setNumberFormat("#,##0.00");
...
© www.soinside.com 2019 - 2024. All rights reserved.