Apache POI 简单操作word文档(2007 .docx格式)

来源:互联网 发布:手机防屏蔽软件 编辑:程序博客网 时间:2024/04/28 10:33

网上找了很多资料大多都是2003的word操作,而2007格式的资料非常少.于是只能自己摸索着做. 还好我的工作中用到的操作不多.
分享一下,虽然说的不多,可能有错误,至少我完成了我的工作.


先到poi官方网站http://poi.apache.org/ 下载poi包,我用的是 poi-3.10.1

解压以后将poi-3.10.1目录下的几个jar包全部导入项目 :

poi-3.10.1-20140818.jar

poi-examples-3.10.1-20140818.jar

poi-excelant-3.10.1-20140818.jar

poi-ooxml-3.10.1-20140818.jar

poi-ooxml-schemas-3.10.1-20140818.jar

poi-scratchpad-3.10.1-20140818.jar

这些包中包含了2003和2007的word , excel, ppt等,也可以根据需要只导入部分用到的包


此外,还要导入ooxml-lib目录里的三个jar包:

dom4j-1.6.1.jar

stax-api-1.0.1.jar

xmlbeans-2.6.0.jar

这是前面那些jar包依赖的包. 细心的人会发现在lib目录里面还有几个依赖的jar包,但是我的项目是用MyEclipse建立的web项目,已经有了,所以我没有重复导入.

如果你在运行中报错没有找到某某包,你可以根据提示,去百度这个包,你就会知道在哪可以下载到这个包


在java中导入需要的包

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.apache.poi.xwpf.usermodel.XWPFTable;import org.apache.poi.xwpf.usermodel.XWPFTableCell;import org.apache.poi.xwpf.usermodel.XWPFTableRow;



1.  读取一个word文档

    XWPFDocument doc;//word文档对象    try{        InputStream in_stream=new FileInputStream("D:\\test.docx");//文件流        doc=new XWPFDocument(in_stream);    }    catch(IOException e){        e.printStackTrace();    }
这样就成功读入了一个word文档,下面可以进行相应的操作

2. 读取段落文本

</pre><pre name="code" class="java">List<XWPFParagraph> _paraList=doc.getParagraphs();//得到一个包含所有段落的ListXWPFParagraph _p=_paraList.get(0);//获取到第一个段落,根据需要读取相应段落List<XWPFRun> _runsList=_p.getRuns();//获取段落中的run列表 XWPFRun _run=_runsList.get(0);//获取第一个run对象String s=_run.getText(0);//获取到run里面的子句字符串_run.setText("这是插入的内容",0);//在0位置插入字符串

从word文档的起始位置开始,读取所有段落. 这里得说说XWPFRun类, 经过我自己测试,一个段落里面有多个XWPFRun对象,它大概是以标点符号,连续空格或者tab将段落划分成子句,一个run管理一个子句.

 例如 段落 "我有一头小毛驴,我从来也不骑.有一天我心血来潮骑它去赶集!"

我测试的时候在每个run子句后面插入数字,发现变成这样: "我有一头小毛驴0,1我从来也不骑2.3有一天我心血来潮骑它去赶集4!5" 

也就是说这个段落有5个XWPFRun对象,段落被拆分成了6个子句: <1>我有一头小毛驴  <2> ,(一个逗号)  <3>我从来也不骑 <4>.(句号) <5>有一天我心血来潮骑它去赶集 <6> !(叹号)

其实我也不大清楚怎么分的,当我在用一长串空格的时候,发现它竟然从中间的某个空格出断出两个子句来(可能是因为这串空格字符是我在不同时间打上去的,就变成了两个子句),

再说说XWPFRun的Position 

查阅 poi 的javadoc可以看到XWPFRun的方法setText(java.lang.String value, int pos) 

根据我测试,使用_run.setText()时

如果pos为 0 时,则是替换_run的子句,即覆盖原有全部内容; 如果pos是1,则是在子句末端追加文字

还有一个方法是 setText(String value); 不需要写插入位置,默认是在末尾追加文字


3.读取表格数据

List<XWPFTable> _tableList=doc.getTables();//获取到word中所有的表格对象XWPFTable _table_table=_tableList.get(0);//得到第一个表格,根据需要获取相应第几个表格 XWPFTableRow _row=_table.getRow(0);//获取表格的第0行,行号下标是从0开始的 XWPFTableCell _cell=_row.getCell(0);//获取该行中第一个单元格,即第0行0列String s=_cell.getText();//读取数据_cell.setText("插入的数据");//插入数据
与段落差不多的方式获取到表格,并读取表格数据,在一些不是方方正正的表格,比如有很多合并单元格的表格中,元素在第几行,第几列你就得好好数数了,可以用插入数据来测试是否插对相应单元格.

但我发现一个问题,就是XWPFTable这个类中我只看到setText这个写入数据的函数,它是在原有内容上追加文字,没找替换文字的方法,因为我的工作没有替换文字的需求,所以我也懒得去找了.有需要的朋友自己查API或者相关资料.

4.保存word到磁盘

try{    OutputStream _os=new FileOutputStream("D:\\temp.docx");    doc.write(_os);}catch(IOException e){    e.printStackTrace();}
路径自己定义

word中还有很多其他操作,比如读取图片, 读取文字字体,样式等等, 具体自己查看相关资料和poi javadoc文档

http://poi.apache.org/apidocs/index.html














0 0