使用POI操做PPT文档(插入文本、图片)转

 

POI 与 Microsoft Office

1. POI 简介 

     POI 是 Apache 下的 Jakata 项目的一个子项目,主要用于提供 java 操做 Microsoft

Office 办公套件如 Excel,Word,Powerpoint 等文件的 API.

     微软的Office 办公软件在企业的平常办公中占据着重要的地位,人们已经很是熟悉

Office 的使用。在咱们开发的应用系统中,经常须要将数据导出到 Excel 文件中,或者

Word 文件中进行打印。好比移动的话费查询系统中就提供了将话费清单导入到 excel 表

格中的功能。这样在web 应用中,咱们在浏览器中看到的数据能够被导出到 Excel 中了。

  • Excel 文件: xls 格式文件对应 POI API 为 HSSF 。 xlsx 格式为 office 2007 的文件格式,POI 中对应的API 为XSSF

  • Word 文件:doc 格式文件对应的 POI API 为 HWPF。 docx 格式为 XWPF

  • powerPoint 文件:ppt 格式对应的 POI API 为 HSLF。 pptx 格式为 XSLF

  • outlook :对应的 API 为 HSMF

  • Visio: 对应的 API 为 HDGF

  • Publisher : 对应的 API 为 HPBF

下面主要介绍如何操做Excel。

2. 下载 POI

     到apache 官方网站下载POI 的jar 包

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

3. Excel 文件的结构

         一个Excel 文档称为工做簿(worksheet),一个工做簿包含多个工做表(sheet),

每一个工做表看起来像一张二维表格,由不少行(row)组成,每行由多个单元格组成(cell).

下面是POI HSSF API 中的类与Excel 结构的对应关系:

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

4. 建立空的 Excel 文件

      新建java项目,导入jar文件

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

4.1 建立空的 xls 文件

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

      建立的xls 文件用excel 打开的时候报错,由于这个 Excel 文件结构不完整。


 

4.2 建立空的 xlsx 文件

     xlsx 文件是 office2007 文件格式,这种文件格式是基于 xml 的,因此须要在项目中加

入xml 文件解析的jar 包。如图,jar包在 poi 发行包中可以找到

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

   一样道理,由于xlsx 文件信息不完整,因此用Excel 打开的时候出现错误

5. 建立工做表

      在前面建立的工做簿(WorkBook)的基础之上建立工做表

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

    建立结果:

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

6. 建立行数据

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

执行后的结果:

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

能够看到日期有一些问题。代码中使用的是”new Date()”,须要作一些转换。

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

这个建立好的格式能够反复使用。

7. 单元格对其方式


 

HSSFCellStyle 中定义了一些对齐方式

为了方便操做,定义一个建立单元格的方法。

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

调用它建立单元格:

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

更多单元格,样式属性方法请参阅发行文档 API

8. 合并单元格

先设置好单元格,而后调用工做表的 addMergedRegion 方法合并单元格

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

结果:

全面了解POI操做Microsoft Office(Word、Excel、PowerPoint)

                 Ok,大功告成!!

 

使用POI操做PPT文档

1)若是是建立新的PPT文档,直接使用SlideShow和Slide类就能够,其中SlideShow表示PPT文档,Slide表示某一张幻灯片
以下代码建立空的PPT文档:

SlideShow ppt = new SlideShow();Slide[] slides = ppt.getSlides();assertTrue(slides.length == 0);savePPTFile(ppt); private void savePPTFile(SlideShow ppt) throws Exception{
         FileOutputStream out = new FileOutputStream(\"ppt测试.ppt\");  ppt.write(out);  out.close();}

2)设置母版,这样后续的新建幻灯片都将使用母版的字体,背景等设置

SlideShow ppt = new SlideShow();//设置幻灯片大小ppt.setPageSize(new Dimension(760,600));SlideMaster master = ppt.getSlidesMasters()[0];       //设置母板背景,支持多种图片格式int picIndex = ppt.addPicture(new File(\"background.png\"), Picture.PNG);Picture background = new Picture(picIndex);//设置图片位置background.setAnchor(new java.awt.Rectangle(0, 0, ppt.getPageSize().width
                                               , ppt.getPageSize().height));master.addShape(background);

3)建立幻灯片并插入文本

SlideShow ppt = new SlideShow();Slide newSlide = ppt.createSlide(); //添加幻灯片标题TextBox title = newSlide.addTitle();RichTextRun titleRun = title.getTextRun().getRichTextRuns()[0];titleRun.setFontColor(Color.RED);title.setText(\"ppt测试\"); //添加文本框TextBox txt = new TextBox();RichTextRun richTextRun = txt.getTextRun().getRichTextRuns()[0];richTextRun.setFontColor(Color.BLUE);  //setText参数字符串能够包含回车、换行符,可是最后一行不能以\\r\\n结尾,不然设置的格式没有效果(v3.5)richTextRun.setText(\"这里能够换行\\r\\n第二行文本\");    txt.setAnchor(new java.awt.Rectangle(50,150,400,400));newSlide.addShape(txt); 
savePPTFile(ppt);

4)插入图片,支持多种格式

SlideShow ppt = new SlideShow();Slide newSlide = ppt.createSlide();int picIndex = ppt.addPicture(new File(\"图片.jpg\"), Picture.JPEG);Picture jpg = new Picture(picIndex); //set image position in the slidejpg.setAnchor(new java.awt.Rectangle(360200280260)); 
newSlide.addShape(jpg);savePPTFile(ppt);

5)插入表格(v3.5)

SlideShow ppt = new SlideShow();Slide slide = ppt.createSlide(); String[][] datas = {
    {\"序号\", \"姓名\",\"年龄\"},    {\"1\", \"张三\",\"30\"},    {\"2\", \"李四\",\"27\"},}; //create a table of 3 rows and 3 columnsTable table = new Table(33); for (int i = 0; i < datas.length; i++) {
    for (int j = 0; j < datas[i].length; j++) {
        TableCell cell = table.getCell(i, j); 
        RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
        rt.setFontName(\"宋体\");
        rt.setFontSize(12); 
        cell.setVerticalAlignment(TextBox.AnchorMiddle);
        cell.setHorizontalAlignment(TextBox.AlignCenter);
        cell.setText(datas[i][j]);         if(i == 0){//首行背景设置为灰色
             cell.setFillColor(Color.GRAY);
        }               
    }} Line border = table.createBorder();border.setLineColor(Color.black);border.setLineWidth(2.0);table.setAllBorders(border);  
slide.addShape(table);table.moveTo(160,260);savePPTFile(ppt);

6)若是是读取已存在的PPT文档则还要用到HSLFSlideShow,下面代码将PPT文件导出为图片(png)格式,若是幻灯片上有中文字符则这些字符的字体须要修改成支持中文的字体(宋体等),不然导出的图片的中文字符不能正常显示

SlideShow ppt = new SlideShow(new HSLFSlideShow(\"PPT测试.ppt\"));Dimension pgsize = ppt.getPageSize();Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) {     BufferedImage img = new BufferedImage(pgsize.width, pgsize.height                                                , BufferedImage.TYPE_INT_RGB);     Graphics2D graphics = img.createGraphics();     //clear the drawing area
    graphics.setPaint(Color.white);
    graphics.fill(new Rectangle2D.Float(00pgsize.widthpgsize.height));     //render
    slide[i].draw(graphics);     FileOutputStream out = new FileOutputStream(\"slide-\"  + (i+1) + \".png\");
    javax.imageio.ImageIO.write(img, \"png\", out);
    out.close();}

7)提取PPT文档信息

SlideShow ppt = new SlideShow(new HSLFSlideShow(\"PPT测试.ppt\"));Slide[] slides = ppt.getSlides();//提取文本信息   for (Slide each : slides) {
    System.out.println(each.getTitle()) ;
    TextRun[] textRuns = each.getTextRuns();
    for (int i=0 ;i< textRuns.length; i++ ) {         System.out.println(textRuns[i].getText());         RichTextRun[] richTextRuns = textRuns[i].getRichTextRuns();         for (int j = 0; j < richTextRuns.length; j++) {             System.out.println(richTextRuns[j].getText());         }     }}//提取全部JPEG图片PictureData[] picDatas = ppt.getPictureData();for (int i=0;i<picDatas.length;i++) {
    if(picDatas[i].getType() == Picture.JPEG){
        FileOutputStream out = new FileOutputStream(\"jpg_\" + i + \".jpg\");
        ppt.write(out);
        out.close();
    }}

8)设置PPT文档摘要信息(文档点击鼠标右键查看属性)

HSLFSlideShow hslf = HSLFSlideShow.create();DocumentSummaryInformation dsi= hslf.getDocumentSummaryInformation();   SummaryInformation si= hslf.getSummaryInformation();    
dsi.setCompany(\"yourCompany\");  dsi.setCategory(\"ppt测试\");   si.setAuthor(\"yourName\");   si.setTitle(\"标题\");   
SlideShow ppt = new SlideShow(hslf);savePPTFile(ppt);

 

POI处理Word、Excel、PowerPoint 简单例子

 

第一:下载POI,在http://jakarta.apache.org/poi/中,下载poi-bin-3.5-beta4-20081128.zip,解压后把jar包引入项目工程。

 

第二:处理Word(Word.java)

import org.apache.poi.hwpf.extractor.WordExtractor;

import java.io.File;

import java.io.InputStream;

 

publicclass Word {

    publicstaticvoid main(String[] args)throws Exception {

       System.out.println(getContent("c://11.doc"));

    }

 

    publicstatic String getContent(String s)throws Exception {

       returngetContent(new java.io.FileInputStream(s));

    }

 

    publicstatic String getContent(File f)throws Exception {

       returngetContent(new java.io.FileInputStream(f));

    }

 

    publicstatic String getContent(InputStream is)throws Exception {

       String bodyText = null;

       WordExtractor ex = new WordExtractor(is);

       bodyText = ex.getText();

       return bodyText;

    }

}

 

 

第三:处理Excel(Excel.java)

import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFCell;

import java.io.File;

import java.io.InputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

 

publicclassExcel {

    publicstaticvoid main(String[] args)throws Exception {

       System.out.println(getContent("c://22.xls"));

    }

 

    publicstatic String getContent(String s)throws Exception {

       returngetContent(new java.io.FileInputStream(s));

    }

 

    publicstatic String getContent(File f)throws Exception {

       returngetContent(new java.io.FileInputStream(f));

    }

 

    publicstatic String getContent(InputStream is)throws Exception {

       StringBuffer content = new StringBuffer();

       HSSFWorkbook workbook = new HSSFWorkbook(is);

       for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {

           HSSFSheet aSheet = workbook.getSheetAt(numSheets);//得到一个sheet

           content.append("/n");

           if (null == aSheet) {

              continue;

           }

           for (int rowNum = 0; rowNum <= aSheet.getLastRowNum(); rowNum++) {

              content.append("/n");

              HSSFRow aRow = aSheet.getRow(rowNum);

              if (null == aRow) {

                  continue;

              }

              for (short cellNum = 0; cellNum <= aRow.getLastCellNum(); cellNum++) {

 

                  HSSFCell aCell = aRow.getCell(cellNum);

                  if (null == aCell) {

                     continue;

                  }

                  if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {

                     content.append(aCell.getRichStringCellValue()

                            .getString());

                  } elseif (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {

                     boolean b = HSSFDateUtil.isCellDateFormatted(aCell);

                     if (b) {

                         Date date = aCell.getDateCellValue();

                         SimpleDateFormat df =new SimpleDateFormat(

                                "yyyy-MM-dd");

                         content.append(df.format(date));

                     }

                  }

              }

           }

       }

       return content.toString();

    }

}

 

 

第四:处理PowerPoint(PowerPoint.java)

import java.io.File;

import java.io.InputStream;

import org.apache.poi.hslf.HSLFSlideShow;

import org.apache.poi.hslf.model.TextRun;

import org.apache.poi.hslf.model.Slide;

import org.apache.poi.hslf.usermodel.SlideShow;

 

publicclassPowerPoint {

    publicstaticvoid main(String[] args)throws Exception {

       System.out.println(getContent("c://33.ppt"));

    }

 

    publicstatic String getContent(String s)throws Exception {

       returngetContent(new java.io.FileInputStream(s));

    }

 

    publicstatic String getContent(File f)throws Exception {

       returngetContent(new java.io.FileInputStream(f));

    }

 

    publicstatic String getContent(InputStream is)throws Exception {

       StringBuffer content = new StringBuffer("");

       SlideShow ss = new SlideShow(new HSLFSlideShow(is));

       Slide[] slides = ss.getSlides();

       for (int i = 0; i < slides.length; i++) {

           TextRun[] t = slides[i].getTextRuns();

           for (int j = 0; j < t.length; j++) {

              content.append(t[j].getText());

           }

           content.append(slides[i].getTitle());

       }

       return content.toString();

    }

}

 

 

 

java 读取 2003 ppt 和 2007 pptx

import java.io.IOException;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.TextRun;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.xslf.XSLFSlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;

public class PptReader {

    /**
     * @param args
     */
    public static String getTextFromPPT2003(String path) {

        StringBuffer content = new StringBuffer("");
        try {

            SlideShow ss = new SlideShow(new HSLFSlideShow(path));// path为文件的全路径名称,创建SlideShow
            Slide[] slides = ss.getSlides();// 得到每一张幻灯片
            for (int i = 0; i < slides.length; i++) {
                TextRun[] t = slides[i].getTextRuns();// 为了取得幻灯片的文字内容,创建TextRun
                for (int j = 0; j < t.length; j++) {
                    content.append(t[j].getText());// 这里会将文字内容加到content中去
                }
                content.append(slides[i].getTitle());
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return content.toString();

    }

    public static String getTextFromPPT2007(String path) {
        XSLFSlideShow slideShow;
        String reusltString=null;
        try {
            slideShow = new XSLFSlideShow(path);
            XMLSlideShow xmlSlideShow = new XMLSlideShow(slideShow);
            XSLFSlide[] slides = xmlSlideShow.getSlides();
            StringBuilder sb = new StringBuilder();
            for (XSLFSlide slide : slides) {
                CTSlide rawSlide = slide._getCTSlide();
                CTGroupShape gs = rawSlide.getCSld().getSpTree();
                CTShape[] shapes = gs.getSpArray();
                for (CTShape shape : shapes) {
                    CTTextBody tb = shape.getTxBody();
                    if (null == tb)
                        continue;
                    CTTextParagraph[] paras = tb.getPArray();
                    for (CTTextParagraph textParagraph : paras) {
                        CTRegularTextRun[] textRuns = textParagraph.getRArray();
                        for (CTRegularTextRun textRun : textRuns) {
                            sb.append(textRun.getT());
                        }
                    }
                }
            }
        reusltString=sb.toString();
        } catch (OpenXML4JException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XmlException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return reusltString;
    }

    public static void main(String[] args) {
        System.out.println(PptReader.getTextFromPPT2003("c:/test.ppt"));
        System.out.println(PptReader.getTextFromPPT2007("c:/test.pptx"));
    }

}

 

 

excel 单元格字符数限制(from microsoft support)

 

 

Microsoft Excel 版本中,一个单元格可包含多达 32,767 个字符。可是,若是某单元格中包含的字符多于 1,024 个,则应遵循如下规则:

  • 大约第 1,024 个字符以后的字符不显示在单元格中;不过,在编辑或选择该单元格时,它们会出如今编辑栏中。

  • 尽管不会显示大约第 1,024 个字符以后的字符,但能够使用工做表函数(例如 RIGHT 和 MID 函数)和宏命令(例如“字符”属性)检测并操做这些字符。

  • 若是复制包含 1,024 个以上字符的单元格,而后将其粘贴到另外一单元格中,则会将全部字符粘贴到新的单元格中。不过,大约第 1,024 个字符以后的字符不会在目标单元格中显示。

  • 没法打印单元格中大约第 1,024 个字符以后的字符,且这些字符也不会在打印预览中显示。

注意 :增长工做表行高和列宽,或修改系统的显示设置后,能够看到的字符数将多于 1,024 个。

 

示例

要了解此问题,请按照下列步骤操做:

  1. 在新工做表的单元格 A1 中,键入如下公式:

    =REPT("w",1024)&"xyz"

  2. 选中单元格 A1,单击“格式”菜单上的“单元格”。

  3. 单击“对齐”选项卡。单击以选中“自动换行”复选框,而后单击“肯定”。

  4. 在“格式”菜单上,指向“列”,而后单击“最适合的列宽”。

    请注意,您只能在单元格 A1 中看到“w”字符,该单元格结尾处的“xyz”字符不会显示。

  5. 在单元格 A2 和 A3 中键入如下公式:

    A2:=RIGHT(A1,3)
    A3:=LEN(A1)

    单元格 A2 中的公式返回结果“xyz”,即单元格最右侧的三个字符。单元格 A3 中包含数字 1027,即单元格 A1 中的字符数。

  6. 将单元格 A1 中的公式更改成:

    =REPT("w",1023)&"xyz"

您能够看到 1,023 个“w”字符及其后的“x”字符。由于存在 1,024 个字符的限制,因此不会显示“yz”字符。单元格 A3 中的公式如今显示 1026,即单元格 A1 的长度。

相关文章
相关标签/搜索