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

时间:2021-07-05 06:25:36

网上找了很多资料大多都是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();//得到一个包含所有段落的List
XWPFParagraph _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