提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文演示通过SpringBoot项目,通过XSLF相关API处理pptx相关文件操作:
提示:以下是本篇文章正文内容,下面案例可供参考
一、XSLF是什么?
XSLF 是 Apache POI 的一部分,全称为 XML Slide Show Format,它是专门为处理 Microsoft PowerPoint 的 Office Open XML (.pptx) 格式文件而设计的 Java API。
XSLF 提供了丰富的 API 接口,通过 XSLF,直接在 Java 应用程序中创建、读取、修改和保存 PowerPoint (.pptx) 演示文稿文件。
二、使用步骤
1.导入apache poi相关依赖
pom代码如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
2.重要类及功能说明
XMLSlideShow :提供了创建、读取、修改 PowerPoint 文档内容的功能。
XSLFTextBox :文本框对象
XSLFTextParagraph :文本段落对象,它可以有自己的样式如居中等
XSLFTextRun :是包含单个连续文本片段的对象,它可以有自己的字体样式、颜色、大小等属性
3.创建一个ppt,添加一个文本框并填入内容
代码如下:
public void createdPpt() throws IOException {
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide(); //创建一个新的幻灯片
XSLFTextBox shape = slide.createTextBox(); //在幻灯片上新建一个文本框对象
XSLFTextParagraph paragraph = shape.addNewTextParagraph(); //在文本框中添加一个新的文本段落
XSLFTextRun titleTextRun = paragraph.addNewTextRun(); //在文本段落中添加文本,
titleTextRun.setText("这是文本内容"); // 设置文本文字
titleTextRun.setFontSize(48.0); // 设置字体大小(假设单位为磅)
titleTextRun.setFontColor(Color.BLACK); // 设置字体颜色
// 设置段落的一些样式
paragraph.setTextAlign(TextParagraph.TextAlign.CENTER); // 居中对齐
Rectangle2D.Double rect = new Rectangle2D.Double(100.0, 100.0, 400.0, 100.0); //设置图形(文本框)的位置及大小,以幻灯片的左上角为原点,参数1指x轴与原点在x方向上的距离,参数2指y轴距原点在y方向上的距离,参数3指宽度,参数4指高度。
shape.setAnchor(rect); //将图形的位置大小参数赋值给文本框
File outFile = new File("D:\\Desktop\\ppt结果演示11.pptx"); //新建文件
if (outFile != null) {
outFile.delete();
}
//导出结果
FileOutputStream out = new FileOutputStream(outFile);
ppt.write(out);
out.close();
System.out.println("文件生成成功!!!");
4.读取已有pptx文件,在表格模板中填充数据
ppt中第二页幻灯片的的表格模板:
代码如下:
public void fillingTable() throws IOException {
/*读取已有的的pptx文件*/
File file = new File("B:\\Desktop\\ppt模板.pptx");
FileInputStream fileInputStream = new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(fileInputStream);
List<XSLFSlide> slideList = ppt.getSlides();
//获取第二页幻灯片
for (XSLFShape shape : slideList.get(1).getShapes()) {
//获取幻灯片上的表格
if (shape instanceof XSLFTable) {
XSLFTable table = (XSLFTable) shape;
List<Map<String, String>> mapList = this.initTableData(); // 预加载表格的数据的逻辑
//识别要填充的表格
if (table.getCell(0, 0).getText() == null || !table.getCell(0, 0).getText().equals("{?table1}")) {
continue;
}
try {
table.getCell(0, 0).setText(""); //清空单元格的标识
//遍历表格的行
for (int row = 0; row < table.getNumberOfRows(); row++) {
if (row > 1) {
Map<String, String> map = mapList.get(row - 2); //前两行数据不替换
//按列来循环表格
for (int colum = 0; colum < table.getNumberOfColumns(); colum++) {
XSLFTableCell cell = table.getCell(row, colum); //通过行数及列数获取到单元格
String placeholder = cell.getText(); //获取单元格中的内容
String newCell = map.get(placeholder); //替换单元格的内容
cell.setText(newCell);
// 获取当前单元格中的第一个段落和该段落的第一个文本运行对象,以便设置字体样式。
XSLFTextParagraph paragraph = cell.getTextParagraphs().get(0);
XSLFTextRun textRun = paragraph.getTextRuns().get(0);
// 设置字体和颜色
if (colum == 0) {
textRun.setFontFamily("微软雅黑"); // 设置字体
textRun.setFontSize(12.0); // 设置字体大小(单位为磅)
textRun.setFontColor(Color.black); // 设置字体颜色
} else {
textRun.setFontFamily("微软雅黑"); // 设置字体
textRun.setFontSize(14.0); // 设置字体大小(单位为磅)
textRun.setFontColor(Color.black); // 设置字体颜色
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
File outFile = new File("B:\\Desktop\\ppt结果演示.pptx");
if (file != null) {
file.delete();
}
FileOutputStream out = new FileOutputStream(outFile);
ppt.write(out);
out.close();
System.out.println("文件生成成功!!!");
}
public List<Map<String, String>> initTableData() {
List<Map<String, String>> dataMapList = new ArrayList<>();
Map<String, String> dataMap1 = new HashMap<>();
dataMap1.put("{name}", "张飞");
dataMap1.put("{politics}", "70");
dataMap1.put("{history}", "80");
dataMap1.put("{geog}", "83");
dataMap1.put("{arts}", "233");
dataMap1.put("{artratio}", "32%");
dataMap1.put("{physics}", "83");
dataMap1.put("{chem}", "80");
dataMap1.put("{creat}", "70");
dataMap1.put("{science}", "233");
dataMap1.put("{sciratio}", "32%");
dataMap1.put("{school}", "涿州中学");
Map<String, String> dataMap2 = new HashMap<>();
dataMap2.put("{name}", "关羽");
dataMap2.put("{politics}", "70");
dataMap2.put("{history}", "80");
dataMap2.put("{geog}", "83");
dataMap2.put("{arts}", "233");
dataMap2.put("{artratio}", "32%");
dataMap2.put("{physics}", "83");
dataMap2.put("{chem}", "80");
dataMap2.put("{creat}", "70");
dataMap2.put("{science}", "233");
dataMap2.put("{sciratio}", "32%");
dataMap2.put("{school}", "郡解中学");
Map<String, String> dataMap3 = new HashMap<>();
dataMap3.put("{name}", "刘备");
dataMap3.put("{politics}", "70");
dataMap3.put("{history}", "80");
dataMap3.put("{geog}", "83");
dataMap3.put("{arts}", "233");
dataMap3.put("{artratio}", "32%");
dataMap3.put("{physics}", "83");
dataMap3.put("{chem}", "80");
dataMap3.put("{creat}", "70");
dataMap3.put("{science}", "233");
dataMap3.put("{sciratio}", "32%");
dataMap3.put("{school}", "涿州中学");
dataMapList.add(dataMap1);
dataMapList.add(dataMap2);
dataMapList.add(dataMap3);
return dataMapList;
结果演示ppt中生成的表格:
5.生成饼状图
代码如下:本例是从excel中的sheet获取的数据,也可以使用XDDFDataSourcesFactory.fromArray(args)方法直接使用数组中的数据
图表模板.xslx 文件中名为“饼状图”的sheet页中的数据,如上图所示
public void pieChart() throws IOException {
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide newSlide = ppt.createSlide();
//获取已有的工作薄excel,中饼状图的数据
File file1 = new File("B:\\0123456789\\Desktop\\图表模板.xlsx");
FileInputStream fileInputStream1 = new FileInputStream(file1);
XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream1);
XSSFSheet sheet1 = workbook.getSheet("饼状图");
// 创建一个图表
XSLFChart chart = ppt.createChart();
// 把工作簿放到图表里,这样可以方便文件更新
chart.setWorkbook(workbook);
// 图表头
chart.setTitleText("期末考试学科分值占比");
// x坐标轴 底部
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
// y轴 左侧
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
//创建一个饼状图
XDDFChartData data = chart.createData(ChartTypes.PIE,bottomAxis,leftAxis);
//设置可变颜色
//data.setVaryColors(true);
//取上述在excel钟的数据,也可以使用XDDFDataSourcesFactory.fromArray(args)用args参数中数组的数据
XDDFDataSource<String> categoryData = XDDFDataSourcesFactory.fromStringCellRange(sheet1, new CellRangeAddress(0,9,1,1));
XDDFNumericalDataSource<Double> valueData = XDDFDataSourcesFactory.fromNumericCellRange(sheet1, new CellRangeAddress(0,9,2,2));
//图表加载数据
XDDFChartData.Series series = data.addSeries(categoryData, valueData);
//画图
chart.plot(data);
CTPlotArea plotArea = chart.getCTChart().getPlotArea(); //plotArea代表了图表中的绘制区域,包含了各种类型的图表元素(如柱状图、折线图、饼图等)
CTPieChart[] pieChartArray = plotArea.getPieChartArray(); //用于获取该CTPlotArea中所有饼图的集合。此方法返回一个CTPieChart类型的数组,每个元素代表一个饼图的所有配置信息,包括数据点、样式设定等。
if(plotArea != null && plotArea.getPieChartArray().length > 0){
CTPieChart pieChart1 = plotArea.getPieChartArray(0);
if(pieChart1 != null && pieChart1.getSerArray().length > 0){
CTDLbls dLbls = pieChart1.getSerArray(0).addNewDLbls();
dLbls.addNewShowVal().setVal(true);//图上面 显示数据
dLbls.addNewShowLegendKey().setVal(true);
dLbls.addNewShowCatName().setVal(true);//图上面 类别名称
dLbls.addNewShowSerName().setVal(true);
dLbls.addNewShowPercent().setVal(true);//图上面 显示百分比
dLbls.addNewShowLeaderLines().setVal(true);// 引导线
dLbls.setSeparator("\n");// 分隔符为分行符
}
}
//图表位置
Rectangle2D.Double rect = new Rectangle2D.Double(10000.0, 10000.0, 3500000.0, 2500000.0);
// 把图加到幻灯片里,指定画布
newSlide.addChart(chart,rect);
File outFile = new File("D:\\Desktop\\ppt结果演示.pptx"); //新建文件
if (outFile != null) {
outFile.delete();
}
//导出结果
FileOutputStream out = new FileOutputStream(outFile);
ppt.write(out);
out.close();
System.out.println("文件生成成功!!!");
总结
本文演示了通过(apache poi)新建pptx,或读取已有的pptx文件操作幻灯片,对文本框、表格及生成饼状图的操作。