我尝试使用以下帖子中的代码创建图表。 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 你能帮忙解决这个问题吗?
发现问题了。
由上述代码创建的
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");
...