java poi ppt操作示例

poi3.9版本,官网 http://poi.apache.org/slideshow/how-to-shapes.html

import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.AutoShape;
import org.apache.poi.hslf.model.Fill;
import org.apache.poi.hslf.model.Freeform;
import org.apache.poi.hslf.model.HeadersFooters;
import org.apache.poi.hslf.model.Hyperlink;
import org.apache.poi.hslf.model.Line;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.model.Shape;
import org.apache.poi.hslf.model.ShapeTypes;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.SlideMaster;
import org.apache.poi.hslf.model.Table;
import org.apache.poi.hslf.model.TableCell;
import org.apache.poi.hslf.model.TextBox;
import org.apache.poi.hslf.model.TextRun;
import org.apache.poi.hslf.usermodel.PictureData;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.usermodel.SoundData;

public class PPTParseUtil {
    public static void main(String[] args) throws IOException {
        SlideShow ppt = new SlideShow();

        // 设置标题,底部信息
        // presentation-scope headers / footers
        HeadersFooters hdd = ppt.getSlideHeadersFooters();
        hdd.setSlideNumberVisible(true);
        hdd.setFootersText("Created by POI-HSLF");

        // add first slide
        Slide s1 = ppt.createSlide();

        // add second slide
        Slide s2 = ppt.createSlide();
        // retrieve page size. Coordinates are expressed in points (72 dpi)
        java.awt.Dimension pgsize = ppt.getPageSize();
        int pgx = pgsize.width; // slide width
        int pgy = pgsize.height; // slide height

        // set new page size
        ppt.setPageSize(new java.awt.Dimension(1024, 768));
        // save changes
        FileOutputStream out = new FileOutputStream("E:\logs\slideshow.ppt");

        // get slides
        Slide[] slide = ppt.getSlides();
        for (int i = 0; i < slide.length; i++) {
            Shape[] sh = slide[i].getShapes();
            for (int j = 0; j < sh.length; j++) {
                // name of the shape
                String name = sh[j].getShapeName();

                // shapes's anchor which defines the position of this shape in
                // the slide
                java.awt.Rectangle anchor = sh[j].getAnchor();

                if (sh[j] instanceof Line) {
                    Line line = (Line) sh[j];
                    // work with Line
                } else if (sh[j] instanceof AutoShape) {
                    AutoShape shape = (AutoShape) sh[j];
                    // work with AutoShape
                } else if (sh[j] instanceof TextBox) {
                    TextBox shape = (TextBox) sh[j];
                    // work with TextBox
                } else if (sh[j] instanceof Picture) {
                    Picture shape = (Picture) sh[j];
                    // work with Picture
                }
            }
        }

        // Drawing a shape on a slide
        Slide slide2 = ppt.createSlide();

        // set slide title
        TextBox title = slide2.addTitle();
        title.setText("Hello, World!");
        // Line shape
        Line line = new Line();
        line.setAnchor(new java.awt.Rectangle(50, 50, 100, 20));
        line.setLineColor(new Color(0, 128, 0));
        line.setLineStyle(Line.LINE_DOUBLE);
        slide2.addShape(line);

        // TextBox
        TextBox txt = new TextBox();
        txt.setText("Hello, World!");
        txt.setAnchor(new java.awt.Rectangle(300, 100, 300, 50));

        // use RichTextRun to work with the text format
        RichTextRun rt = txt.getTextRun().getRichTextRuns()[0];
        rt.setFontSize(32);
        rt.setFontName("Arial");
        rt.setBold(true);
        rt.setItalic(true);
        rt.setUnderlined(true);
        rt.setFontColor(Color.red);
        rt.setAlignment(TextBox.AlignRight);

        slide2.addShape(txt);

        // create shapes of arbitrary geometry
        java.awt.geom.GeneralPath path = new java.awt.geom.GeneralPath();
        path.moveTo(100, 100);
        path.lineTo(200, 100);
        path.curveTo(50, 45, 134, 22, 78, 133);
        path.curveTo(10, 45, 134, 56, 78, 100);
        path.lineTo(100, 200);
        path.closePath();

        Freeform shape = new Freeform();
        shape.setPath(path);
        slide2.addShape(shape);

        // Autoshape
        // 32-point star
        AutoShape sh1 = new AutoShape(ShapeTypes.Star32);
        sh1.setAnchor(new java.awt.Rectangle(50, 50, 100, 200));
        sh1.setFillColor(Color.red);
        slide2.addShape(sh1);

        // Trapezoid
        AutoShape sh2 = new AutoShape(ShapeTypes.Trapezoid);
        sh2.setAnchor(new java.awt.Rectangle(150, 150, 100, 200));
        sh2.setFillColor(Color.blue);
        slide2.addShape(sh2);

        // work with pictures
        // extract all pictures contained in the presentation
        PictureData[] pdata = ppt.getPictureData();
        for (int ii = 0; ii < pdata.length; ii++) {
            PictureData pict = pdata[ii];

            // picture data
            byte[] data = pict.getData();

            int type = pict.getType();
            String ext;
            switch (type) {
            case Picture.JPEG:
                ext = ".jpg";
                break;
            case Picture.PNG:
                ext = ".png";
                break;
            case Picture.WMF:
                ext = ".wmf";
                break;
            case Picture.EMF:
                ext = ".emf";
                break;
            case Picture.PICT:
                ext = ".pict";
                break;
            default:
                continue;
            }
            FileOutputStream out2 = new FileOutputStream("pict_" + ii + ext);
            out2.write(data);
            out2.close();

        }

        // add a new picture to this slideshow and insert it in a new slide
        int idx = ppt.addPicture(new File("E:\logs\clock.png"), Picture.PNG);

        Picture pict = new Picture(idx);

        // set image position in the slide
        pict.setAnchor(new java.awt.Rectangle(100, 100, 300, 200));

        Slide slide3 = ppt.createSlide();
        slide3.addShape(pict);

        // This slide has its own background.
        // Without this line it will use master's background.
        slide3.setFollowMasterBackground(false);
        Fill fill = slide3.getBackground().getFill();
        int idx1 = ppt.addPicture(new File("E:\logs\clock.png"), Picture.PNG);
        fill.setFillType(Fill.FILL_PATTERN);
        fill.setPictureData(idx1);

        // create bulleted lists

        TextBox shape1 = new TextBox();
        RichTextRun rt1 = shape1.getTextRun().getRichTextRuns()[0];
        shape1.setText("January
" + "February
" + "March
" + "April");
        rt1.setFontSize(42);
        rt1.setBullet(true);
        rt1.setBulletOffset(0); // bullet offset
        rt1.setTextOffset(50); // text offset (should be greater than bullet
                                // offset)
        rt1.setBulletChar('u263A'); // bullet character
        slide3.addShape(shape1);

        shape1.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); // position
                                                                    // of the
                                                                    // text box
                                                                    // in the
                                                                    // slide
        slide3.addShape(shape1);

        // now retrieve pictures containes in the first slide and save them on
        // disk
        slide3 = ppt.getSlides()[0];
        Shape[] sh3 = slide3.getShapes();
        for (int i2 = 0; i2 < sh3.length; i2++) {
            if (sh3[i2] instanceof Picture) {
                Picture pict1 = (Picture) sh3[i2];
                PictureData pictData = pict1.getPictureData();
                byte[] data = pictData.getData();
                int type = pictData.getType();
                if (type == Picture.JPEG) {
                    FileOutputStream out3 = new FileOutputStream("slide0_" + i2
                            + ".jpg");
                    out3.write(data);
                    out3.close();
                } else if (type == Picture.PNG) {
                    FileOutputStream out4 = new FileOutputStream("slide0_" + i2
                            + ".png");
                    out4.write(data);
                    out4.close();
                }
            }
        }

        // modify background of a slide master
        SlideMaster master = ppt.getSlidesMasters()[0];

        Fill fill1 = master.getBackground().getFill();
        int idx11 = ppt
                .addPicture(new File("E:\logs\clock.png"), Picture.PNG);
        fill1.setFillType(Fill.FILL_PICTURE);
        fill1.setPictureData(idx11);

        // read hyperlinks from a slide show
        Slide[] slide1 = ppt.getSlides();
        for (int j = 0; j < slide1.length; j++) {

            // read hyperlinks from the text runs
            TextRun[] txt1 = slide1[j].getTextRuns();
            if (txt1 == null || txt1.length == 0) {
                continue;
            }
            for (int k = 0; k < txt1.length; k++) {
                String text = txt1[k].getText();
                Hyperlink[] links = txt1[k].getHyperlinks();
                if (links != null)
                    for (int l = 0; l < links.length; l++) {
                        Hyperlink link = links[l];
                        String title1 = link.getTitle();
                        String address = link.getAddress();
                        String substring = text.substring(link.getStartIndex(),
                                link.getEndIndex() - 1); // in ppt end index is
                                                            // inclusive
                        System.out.println(title1 + address + substring);
                    }
            }

            // in PowerPoint you can assign a hyperlink to a shape without text,
            // for example to a Line object. The code below demonstrates how to
            // read such hyperlinks
            Shape[] sh = slide1[j].getShapes();
            for (int k = 0; k < sh.length; k++) {
                Hyperlink link = sh[k].getHyperlink();
                if (link != null) {
                    String title1 = link.getTitle();
                    String address = link.getAddress();
                    System.out.println(title1 + address);
                }
            }
        }

        // table data
        String[][] data = { { "INPUT FILE", "NUMBER OF RECORDS" },
                { "Item File", "11,559" }, { "Vendor File", "300" },
                { "Purchase History File", "10,000" },
                { "Total # of requisitions", "10,200,038" } };

        // 创建表格
        Slide slide11 = ppt.createSlide();
        // create a table of 5 rows and 2 columns
        Table table = new Table(5, 2);
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                TableCell cell = table.getCell(i, j);
                cell.setText(data[i][j]);

                RichTextRun rt11 = cell.getTextRun().getRichTextRuns()[0];
                rt11.setFontName("Arial");
                rt11.setFontSize(10);

                cell.setVerticalAlignment(TextBox.AnchorMiddle);
                cell.setHorizontalAlignment(TextBox.AlignCenter);
            }
        }

        // set table borders
        Line border = table.createBorder();
        border.setLineColor(Color.black);
        border.setLineWidth(1.0);
        table.setAllBorders(border);

        // set width of the 1st column
        table.setColumnWidth(0, 300);
        // set width of the 2nd column
        table.setColumnWidth(1, 150);

        slide11.addShape(table);
        table.moveTo(100, 100);

        // retrieve embedded sounds 获取语音信息
        SoundData[] sound = ppt.getSoundData();
        for (int i = 0; i < sound.length; i++) {
            // save *WAV sounds on disk
            if (sound[i].getSoundType().equals(".WAV")) {
                FileOutputStream out1 = new FileOutputStream(
                        sound[i].getSoundName());
                out1.write(sound[i].getData());
                out1.close();
            }
        }

        ppt.write(out);
        out.close();
    }
}

本文转自:http://blog.csdn.net/zhongweijian/article/details/8299531

原文地址:https://www.cnblogs.com/dreammyle/p/5115458.html