【Apache POI 新建、读取、编辑pptx文件】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文演示通过SpringBoot项目,通过XSLF相关API处理pptx相关文件操作:


提示:以下是本篇文章正文内容,下面案例可供参考

一、XSLF是什么?

博客:查看Apache POI 常用模块及功能

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中第二页幻灯片的的表格模板:
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中生成的表格:
这是ppt结果演示的表格

5.生成饼状图

代码如下:本例是从excel中的sheet获取的数据,也可以使用XDDFDataSourcesFactory.fromArray(args)方法直接使用数组中的数据
数据sheet页
图表模板.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文件操作幻灯片,对文本框、表格及生成饼状图的操作。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值