步骤 1: 添加Apache POI依赖
首先,在项目的pom.xml文件中添加Apache POI的依赖项:
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
步骤 2: 封装PPTGenerator工具类
创建PPT文件:
createNewPPT: 创建一个新的PPT文件并保存到指定路径。
使用try-with-resources语句确保文件流正确关闭。
添加幻灯片:
addSlide: 添加一个新的幻灯片,并设置标题。
检查标题占位符是否存在,并设置标题。
添加图表:
addChartToSlide: 向幻灯片中添加图表,支持柱状图和折线图。
创建Excel工作簿和工作表,填充数据。
根据图表类型创建相应的图表,并设置标题和图例。
创建柱状图和折线图:
createBarChart 和 createLineChart: 分别创建柱状图和折线图。
确保数据系列正确添加到图表中。
保存PPT文件:
save: 将PPT文件保存到磁盘上。
使用try-with-resources语句确保文件流正确关闭
代码片段:
import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class PPTGenerator {
private XMLSlideShow ppt;
private int slideIndex = 0;
public PPTGenerator() {
this.ppt = new XMLSlideShow();
}
/**
* 创建新的PPT文件
* @param fileName 文件名
*/
public void createNewPPT(String fileName) {
try (FileOutputStream out = new FileOutputStream(fileName)) {
ppt.write(out);
} catch (IOException e) {
throw new RuntimeException("Failed to create new PPT file", e);
}
}
/**
* 添加一个新幻灯片
* @param title 幻灯片标题
*/
public void addSlide(String title) {
XSLFSlide slide = ppt.createSlide();
XSLFTitle titleShape = slide.getLayout().getTitlePlaceholder();
if (titleShape != null) {
titleShape.setText(title);
}
slideIndex++;
}
/**
* 向幻灯片中添加图表
* @param chartType 图表类型
* @param title 图表标题
* @param xAxisLabel X轴标签
* @param yAxisLabel Y轴标签
* @param dataSeries 数据系列
* @param categories 类别标签
*/
public void addChartToSlide(ChartType chartType, String title, String xAxisLabel, String yAxisLabel,
DataSeries[] dataSeries, String... categories) {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Data");
// 创建数据表格
XSSFRow headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue(xAxisLabel);
for (int i = 0; i < dataSeries.length; i++) {
headerRow.createCell(i + 1).setCellValue(dataSeries[i].getName());
}
for (int i = 0; i < categories.length; i++) {
XSSFRow row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(categories[i]);
for (int j = 0; j < dataSeries.length; j++) {
row.createCell(j + 1).setCellValue(dataSeries[j].getData()[i]);
}
}
// 获取当前幻灯片
XSLFSlide slide = ppt.getSlides()[slideIndex - 1];
// 创建图表
XSLFChart chart = slide.createChart(XSLFClientAnchor.A1, workbook, "rId1", 600, 400);
switch (chartType) {
case BAR:
createBarChart(chart, title, xAxisLabel, yAxisLabel, dataSeries);
break;
case LINE:
createLineChart(chart, title, xAxisLabel, yAxisLabel, dataSeries);
break;
default:
throw new IllegalArgumentException("Unsupported chart type: " + chartType);
}
// 设置图表标题
XSLFChartTitle chartTitle = chart.setTitle(title);
chartTitle.setPosition(XSLFChartTitle.Position.NORTH);
// 设置图例
XSLFChartLegend legend = chart.getOrCreateLegend();
legend.setPosition(XSLFChartLegend.Position.RIGHT);
// 释放资源
workbook.close();
}
private void createBarChart(XSLFChart chart, String title, String xAxisLabel, String yAxisLabel, DataSeries[] dataSeries) {
XSLFLineChartData lineChartData = chart.getOrAddNewSeriesAxis().createData(XSLFLineChartData.class);
for (DataSeries series : dataSeries) {
XSLFLineSeries lineSeries = lineChartData.addSeries(xAxisLabel, xAxisLabel);
lineSeries.setTitle(series.getName());
for (double value : series.getData()) {
lineSeries.addPoint(value);
}
}
}
private void createLineChart(XSLFChart chart, String title, String xAxisLabel, String yAxisLabel, DataSeries[] dataSeries) {
XSLFLineChartData lineChartData = chart.getOrAddNewSeriesAxis().createData(XSLFLineChartData.class);
for (DataSeries series : dataSeries) {
XSLFLineSeries lineSeries = lineChartData.addSeries(xAxisLabel, xAxisLabel);
lineSeries.setTitle(series.getName());
for (double value : series.getData()) {
lineSeries.addPoint(value);
}
}
}
/**
* 保存PPT文件
*/
public void save() {
try (FileOutputStream out = new FileOutputStream("output.pptx")) {
ppt.write(out);
} catch (IOException e) {
throw new RuntimeException("Failed to save PPT file", e);
}
}
public static void main(String[] args) {
PPTGenerator pptGen = new PPTGenerator();
// 创建新的PPT
pptGen.createNewPPT("test.pptx");
// 添加一个新幻灯片
pptGen.addSlide("Title Slide");
// 准备数据系列
DataSeries sales = new DataSeries("Sales", new double[]{100, 120, 150});
DataSeries expenses = new DataSeries("Expenses", new double[]{70, 80, 90});
// 创建一个柱状图
pptGen.addChartToSlide(ChartType.BAR, "Financial Data", "Years", "Amount",
new DataSeries[]{sales, expenses}, "2018", "2019", "2020");
// 创建一个折线图
pptGen.addChartToSlide(ChartType.LINE, "Financial Data", "Years", "Amount",
new DataSeries[]{sales, expenses}, "2018", "2019", "2020");
// 保存PPT
pptGen.save();
}
}
enum ChartType {
BAR, LINE
}
class DataSeries {
private String name;
private double[] data;
public DataSeries(String name, double[] data) {
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public double[] getData() {
return data;
}
}
总结
以上代码实现了从创建PPT文件、添加幻灯片、插入图表到保存PPT文件的完整流程。每个步骤都有详细的注释和逻辑处理,确保代码的正确性和可读性。你可以根据实际需求进一步扩展或修改这个工具类。