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 包

3. Excel 文件的结构

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

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

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

4. 创建空的 Excel 文件

新建java项目,导入jar文件

4.1 创建空的 xls 文件

创建的xls 文件用excel 打开的时候报错,因为这个 Excel 文件结构不完整。

4.2 创建空的 xlsx 文件

xlsx 文件是 office2007 文件格式,这种文件格式是基于 xml 的,所以需要在项目中加

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

同样道理,因为xlsx 文件信息不完整,所以用Excel 打开的时候出现错误

5. 创建工作表

在前面创建的工作簿(WorkBook)的基础之上创建工作表

创建结果:

6. 创建行数据

执行后的结果:

可以看到日期有一些问题。代码中使用的是”new Date()”,需要做一些转换。

这个创建好的格式可以反复使用。

7. 单元格对其方式

HSSFCellStyle 中定义了一些对齐方式

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

调用它创建单元格:

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

8. 合并单元格

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

结果:

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(360, 200, 280, 260));

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(3, 3); for (int i = 0; i

for (int j = 0; 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

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(0, 0, pgsize.width, pgsize.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

System.out.println(textRuns[i].getText());

RichTextRun[] richTextRuns = textRuns[i].getRichTextRuns();

for (int j = 0; j

System.out.println(richTextRuns[j].getText());

}

}}//提取所有JPEG图片PictureData[] picDatas = ppt.getPictureData();for (int i=0;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"));

}

}

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

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

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

如果复制包含 1,024 个以上字符的单元格,然后将其粘贴到另一单元格中,则会将所有字符粘贴到新的单元格中。不过,大约第 1,024 个字符之后的字符不会在目标单元格中显示。

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

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

示例

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

在新工作表的单元格 A1 中,键入以下公式:

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

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

单击“对齐”选项卡。单击以选中“自动换行”复选框,然后单击“确定”。

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

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

在单元格 A2 和 A3 中键入以下公式:

A2:=RIGHT(A1,3)

A3:=LEN(A1)

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

将单元格 A1 中的公式更改为:

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

您可以看到 1,023 个“w”字符及其后的“x”字符。因为存在 1,024 个字符的限制,所以不会显示“yz”字符。单元格 A3 中的公式现在显示 1026,即单元格 A1 的长度。

java poi word宏_全面了解POI操作Microsoft Office(Word、Excel、PowerPoint)相关推荐

  1. 关于“Microsoft office word 遇到问题需要关闭”解决方法

    今天遇到一电脑打开word,跳出一对话框,提示"Microsoft office word 遇到问题需要关闭", 如下图,百度了一下,是word里面的模版破坏了, 解决方法很简单, ...

  2. microsoft office word 遇到问题需要关闭, 这是第二次遇到这个问题了

    当我们打开Word文档时,会提示"Microsoft office word遇到问题需要关闭.我们对此引起的不便表示抱 歉".这时我们可以通过以下办法解决这个问题. 1.进入下面的 ...

  3. mongodb上一篇下一篇_如何使用Microsoft office word—上一篇

    从这一期开始,将会逐一介绍Microsoft office的几个常用的软件,例如word ppt excel等,每一个软件将分为几期介绍,这几期介绍word.注意:介绍软件版本是Microsoft o ...

  4. postscript怎么打开_怎么把在学习中用的Adobe PDF文件转换成Microsoft office Word

    现在我们普遍用的都是Adobe PDF格式的文件,可是Microsoft office Word(.doc,.docx)文档也是我们经常要用的,所以就需要将Adobe PDF转换Microsoft o ...

  5. smartfroms word编辑_请教Microsoft Office Word 2007 SmartArt图形文本如何直接在里面添加字,修改字。如图。...

    展开全部 观型外观 Office PowerPoint 2007 具有一个称为 Microsoft Office Fluent 用户界面 的全新直观用户界面:与早期版本的 PowerPoint 相比, ...

  6. “Microsoft Office Word遇到问题需要关闭_陕南赤子_新浪博客

    "Microsoft Office Word遇到问题需要关闭 Word打不开症状:双击运行Word时,Word打不开,弹出窗口提示:"Microsoft Office Word遇到 ...

  7. 打开word就报错“Microsoft Office Word 遇到问题需要关闭如何解决?

    遇到过"Microsoft Office Word 遇到问题需要关闭.我们对此引起的不便表示抱歉"的提示呢?然后有一个"恢复我的工作并重启 Microsoft Offic ...

  8. 打开word文档时提示“Microsoft Office Word已停止工作”

    我的电脑(Win10)有Office 2003和2013两个版本,可能由于之前超长待机等原因导致word 2003的文件(.doc)不能正常打开,没次都会提示"Microsoft Offic ...

  9. 【牛客】新建 Microsoft Office Word 文档题解

    原题链接 题目描述 CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office Word ...

最新文章

  1. oracle split去逗号,行列转换 转载
  2. mini-uboot 启动过程简单分析
  3. 局域网实现VLAN实例
  4. 智能推荐:“相关性搜索”只给你最想要的
  5. android自定义view流程,Android 自定义View--从源码理解View的绘制流程
  6. 计算两个日期之间的时间差(毫秒数)
  7. Android中的观察者DataSetObservable和DataSetObserver
  8. JavaScript:正则表达式 分组
  9. Leetcode1293.网格中的最短路径
  10. Entity Framework的简单使用之一对一关系
  11. t-sql中引号的使用规则 转
  12. 三桥君:如何把SQL Server的数据库导为sql文件
  13. 计算机usb接口失灵,电脑usb接口没反应,教您电脑usb接口没反应怎么解决
  14. iOS蓝牙连接打印机,打印小票
  15. linux下如何统计一个目录下的文件个数以及代码总行数的命令
  16. 从一加到100等于多少c语言,从一加到99等于多少
  17. 如何自己编写一个交通仿真软件(一)火种
  18. ros2订阅esp32发布的电池电压数据-补充
  19. 【随手记】Oracle存储过程报错 Compilation errors for PACKAGE BODY
  20. Activity中getWindow().setBackground()与getWindw().getDecorView().setBackground()的区别

热门文章

  1. 基于Python的Opencv 自动识别银行卡卡号系统
  2. 社群思维:如何打破边界
  3. 蜘蛛侠:迈尔斯·莫拉莱斯 实机演示截图及游戏下载
  4. mysql数据库自增_mysql数据库自增id用法大全
  5. 基于深度学习LSTM算法生成音乐
  6. 山东省高新技术企业认定条件及奖励
  7. vue配置各种环境-环境切换问题-打包自由切换
  8. [附源码]计算机毕业设计springboot-大学生健康档案管理
  9. 计算机有残留office,Microsoft Office怎么卸载干净?
  10. android 修改呼出号码,在android中监听呼出电话(电话拦截、修改呼出电话)