pra*_*avi 1 java charts apache-poi
我尝试使用以下帖子中的代码创建图表。 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道在这里做什么。@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");
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |