Java基于POI对PPT的基本操作

Java基于POI对PPT的基本操作

         在Java中对PPT文件进行操作的话,我使用的是Apache的开源项目POI。该项目的功能主要是使用Java开发或生成微软办公文件,比如:Word、Excel、PPT、Visio等。其中实现对PPT文件进行操作的类包主要是HSLF(.ppt)和XSLF(.pptx),在本文中,会以XSLF为主。

一、创建PPT文件,并生成空白幻灯片

package com.jointstarc.test;

 

import java.io.FileOutputStream;

import java.io.IOException;

 

import org.apache.poi.xslf.usermodel.XMLSlideShow;

import org.apache.poi.xslf.usermodel.XSLFSlide;

 

public class Demo1 {

    public static void main(String[] args) {

       // 创建一个空白PPT

       XMLSlideShow ppt = new XMLSlideShow();

       // 在空白的PPT中创建一个空白的幻灯片

       XSLFSlide slide = ppt.createSlide();

       try {

           // 对新建的PPT保存到硬盘里

           ppt.write(new FileOutputStream("D://test3.pptx"));

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           if (ppt != null) {

              try {

                  // 保存完之后要对PPT进行关闭操作

                  ppt.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

           }

       }

    }

}

二、在空白幻灯片中添加内容

2.1、添加文本框和超链接

/*

        * 在空幻灯片中插入一个文本框,然后在文本框中写入文字,

        * 并给文字添加一个超链接

        */

       // 在幻灯片中插入一个文本框

       XSLFTextShape ts = slide.createTextBox();

       // 设置文本框的位置和文本框大小

       ts.setAnchor(new Rectangle(150, 150, 200, 50));

       // 设置文本框里面的文字

       XSLFTextRun tr = ts.addNewTextParagraph().addNewTextRun();

       tr.setText("测试一下");

       // 给文本添加颜色

       tr.setFontColor(Color.RED);

       // 给文本添加超链接

       XSLFHyperlink link = tr.createHyperlink();

        link.setAddress("http://www.baidu.com");

2.2、添加表格

/*

         * 在幻灯片中添加表格

         */

        // 在幻灯片中插入一个表格

        XSLFTable table = slide1.createTable();

        // 设置表格的位置和表格大小

        table.setAnchor(new Rectangle(50, 100, 100, 100));

        for (int i = 0; i < 5; i++) {

            // 在表格中添加一行

            XSLFTableRow row = table.addRow();

            for (int j = 0; j < 5; j++) {

               // 在行中添加一个单元格

               XSLFTableCell cell = row.addCell();

               // 设置单元格中的内容和样式

               XSLFTextParagraph p = cell.addNewTextParagraph();

               p.setTextAlign(TextAlign.CENTER);

               XSLFTextRun tr1 = p.addNewTextRun();

               tr1.setFontColor(Color.RED);

               tr1.setText("测试" + i + j);

               // 设置单元格边框的粗细

               cell.setBorderWidth(BorderEdge.bottom, 2.0);

                cell.setBorderWidth(BorderEdge.left, 2.0);

                cell.setBorderWidth(BorderEdge.right, 2.0);

                cell.setBorderWidth(BorderEdge.top, 2.0);

                // 设置单元格边框的颜色

                cell.setBorderColor(BorderEdge.bottom, Color.black);

                cell.setBorderColor(BorderEdge.left, Color.black);

                cell.setBorderColor(BorderEdge.right, Color.black);

                cell.setBorderColor(BorderEdge.top, Color.black);

           }

        }

2.3、添加图片

/*

         * 在幻灯片中插入一张图片

         */

        // 图片文件

        File image = new File("D://111.jpg");

        // 图片文件输入流

       FileInputStream imageFis = new FileInputStream(image);

       // 获取图片大小

       int len = (int) image.length();

       // 创建一个字节数组,数组大小与图片文件大小一致

       byte[] imageData = new byte[len];

       // 将图片数据读进字节数组中

       imageFis.read(imageData);

       // 将图片添加到PPT

       XSLFPictureData pd = ppt.addPicture(imageData, PictureData.PictureType.JPEG);

       // 将图片放到指定的幻灯片中

        XSLFPictureShape pic = slide2.createPicture(pd);

      // 设置图片框的放置的位置和大小

        pic.setAnchor(new Rectangle(50, 100, 200, 200));

三、读取现有的PPT文件,并在已有的幻灯片后添加幻灯片

package com.jointstarc.test;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

import org.apache.poi.xslf.usermodel.XMLSlideShow;

import org.apache.poi.xslf.usermodel.XSLFSlide;

 

public class Demo2 {

    public static void main(String[] args) {

       XMLSlideShow ppt = null;

       try {

           // 通过输入流读取一个现有的PPT文件,生成PPT

           ppt = new XMLSlideShow(new FileInputStream("D://test.pptx"));

           // 在现有的PPT文件后面新建一个空白幻灯片

           XSLFSlide slide = ppt.createSlide();

           // 将修改后的PPT文件回写到硬盘

           ppt.write(new FileOutputStream("D://test3.pptx"));

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           if (ppt != null) {

              try {

                  // 保存完之后要对PPT进行关闭操作

                  ppt.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

           }

       }

    }

}

四、读取现有的PPT内容,并进行修改

4.1、获取PPT的所有文本框里的文字,并进行更改

/*

 * 获取PPT的所有文本框里的文字,并进行更改

 */

// 获取PPT中的所有幻灯片

List slides = ppt.getSlides();

// 遍历幻灯片

for (XSLFSlide slide : slides) {

    // 获取幻灯片中的所有图形(文本框、表格、图形...

    List shapes = slide.getShapes();

    // 遍历图形

    for (XSLFShape shape : shapes) {

        // 判断该图形类是否是文本框类

        if (shape instanceof XSLFTextShape) {

           // 将图像类强制装换成文本框类

           XSLFTextShape ts = (XSLFTextShape) shape;

           // 获取文本框内的文字

           String str = ts.getText();

           System.out.println(str);

          

           // 若想对文本框内的文字进行更改,还需要进行如下步骤

           List textParagraphs = ts.getTextParagraphs();

           for (XSLFTextParagraph tp : textParagraphs) {

              List textRuns = tp.getTextRuns();

              for (XSLFTextRun r : textRuns) {

                  if ("201809".equals(r.getRawText())) {

                     // 对匹配到的字符串进行更改

                     r.setText("2018-09");

                     // 设置字体颜色

                     r.setFontColor(Color.RED);

                  }

              }

           }

         }

    }

}

4.2、获取PPT的所有表格里的文字,并进行更改

/*

 * 获取PPT的所有表格里的文字,并进行更改

 */

// 获取PPT中的所有幻灯片

List slides = ppt.getSlides();

for (XSLFSlide slide : slides) {

    // 获取幻灯片中的所有图形(文本框、表格、图形...

    List shapes = slide.getShapes();

    for (XSLFShape shape : shapes) {

       // 判断该图形类是否是表格类

       if (shape instanceof XSLFTable) {

           // 将图像类强制装换成表格类

           XSLFTable table = (XSLFTable) shape;

           // 获取表格中的所有行

           List rows = table.getRows();

           for (XSLFTableRow tr : rows) {

              // 获取行中的所有单元格

              List cells = tr.getCells();

              for (XSLFTableCell tc : cells) {

                  // 获取单元格内的文字

                  String str = tc.getText();

                  // 若想对表格内的文字进行更改,还需要进行如下步骤

                  List textParagraphs = tc.getTextParagraphs();

                  for (XSLFTextParagraph tp : textParagraphs) {

                     List textRuns = tp.getTextRuns();

                     for (XSLFTextRun r : textRuns) {

                         if ("风险指标".equals(r.getRawText())) {

                            // 对匹配到的字符串进行更改

                            r.setText("测试修改文字");

                            // 设置字体颜色

                            r.setFontColor(Color.RED);

                         }

                     }

                  }

              }

           }

       }

    }

}

4.3、获取PPT的所有图片,并进行更改

/*

 * 获取PPT的所有图片,并进行更改

 */

// 获取PPT中的所有幻灯片

List slides = ppt.getSlides();

for (XSLFSlide slide : slides) {

    // 获取幻灯片中的所有图形(文本框、表格、图形...

    List shapes = slide.getShapes();

    for (XSLFShape shape : shapes) {

        // 判断该图形类是否是图片框类

        if (shape instanceof XSLFPictureShape) {

           /*

            * 获取图片数据

            */

           // 将图像类强制装换成图片框类

           XSLFPictureShape ps = (XSLFPictureShape) shape;

           // 获取图片的字节码数据(可以利用输出流将该图片保存到硬盘里)

           byte [] pictureData = ps.getPictureData().getData();

           /*

            * 更改图片

            */

           // 图片文件

            File image = new File("D://222.jpg");

            // 图片文件输入流

           FileInputStream imageFis = new FileInputStream(image);

           // 获取图片大小

           int len = (int) image.length();

           // 创建一个字节数组,数组大小与图片文件大小一致

           byte[] imageData = new byte[len];

          

           if (imageFis.read(imageData) != -1) {

               // 更换图片必须图片设置索引,要不不生效

                ps.getPictureData().setIndex(1);

                ps.getPictureData().setData(imageData);

           }

           // 关闭输入流

           imageFis.close();

         }

    }

}

 

 若转装载,请标明来源,谢谢!

你可能感兴趣的:(java)