java用poi实现对word读取和修改操作
2012-06-05 20:54
806 查看
java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob、poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便。它是Apache组织的一个项目,早在2001年就已经发布了第
一个版本,可以说是apache组织的一个老牌项目,到现在已经走过了10年光辉历程,目前最新版本是3.8的beta版本。下面就以该版本来演示如何实 现对word进行读取和改写值操作。
本文的所有源代码可以通过下载poi实现对word读写操作实例源码 (3)获得。
1.下载
下载3.8beta4版本,请记得一定要下载该版本,其他版本读取word模板并改写内容生成新的文件后,打开新文件时会提示“word无法读取文档,文档可能损坏。”,见下图
低版本poi生成word文档打开时的错误
2.集成到项目
这一步很简单,只要把下载后解压得到的poi-3.8-beta4-20110826.jar和poi-scratchpad-3.8-beta4-20110826.jar两个文件复制到java web项目的lib目录下就行了
3.制作word模板
把需要变动的值全部用代码来代替,例如你需要改变名称的值,则可以在模板中用name来表示。详细见附件中的doc文件。
4.调用接口方法实现对word的读写操作
整个过程就是先读取模板,然后修改内容,再重新生成新的文档保存到本地或者输出文件流提供下载,下面分别是生成新文档和输出文件流两种方式的代码片断,详细的代码请见下列代码中的readwriteWord()两个重载方法。
==========================================================================
//======================生成新文档的方式::==========================
package work.tool;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.FieldsDocumentPart;
import org.apache.poi.hwpf.usermodel.Field;
import org.apache.poi.hwpf.usermodel.Fields;
import org.apache.poi.hwpf.usermodel.Range;
/**
* 实现java用poi实现对word读取和修改操作
* @author fengcl
*
*/
public class ReadAndWriteDoc {
/**
* 实现对word读取和修改操作
* @param filePath word模板路径和名称
* @param map 待填充的数据,从数据库读取
*/
public static void readwriteWord(String filePath, Map<String,String> map){
//读取word模板
// String fileDir = new File(base.getFile(),"http://www.cnblogs.com/http://www.cnblogs.com/../doc/").getCanonicalPath();
FileInputStream in = null;
try {
in = new FileInputStream(new File(filePath));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
HWPFDocument hdt = null;
try {
hdt = new HWPFDocument(in);
} catch (IOException e1) {
e1.printStackTrace();
}
Fields fields = hdt.getFields();
Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN).iterator();
while(it.hasNext()){
System.out.println(it.next().getType());
}
//读取word文本内容
Range range = hdt.getRange();
System.out.println(range.text());
//替换文本内容
for (Map.Entry<String,String> entry: map.entrySet()) {
range.replaceText("$" + entry.getKey() + "$",entry.getValue());
}
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
String fileName = ""+System.currentTimeMillis();
fileName += ".doc";
FileOutputStream out = null;
try {
out = new FileOutputStream("E:\\test\\"+fileName,true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
hdt.write(ostream);
} catch (IOException e) {
e.printStackTrace();
}
//输出字节流
try {
out.write(ostream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ostream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//======================输出文件流下载方式:==========================
/**
* 实现对word读取和修改操作
* @param response 响应,设置生成的文件类型,文件头编码方式和文件名,以及输出
* @param filePath word模板路径和名称
* @param map 待填充的数据,从数据库读取
*/
public static void readwriteWord(HttpServletResponse response, String filePath, Map<String, String> map){
//读取word模板文件
// String fileDir = new File(base.getFile(),"http://www.cnblogs.com/http://www.cnblogs.com/../doc/").getCanonicalPath();
// FileInputStream in = new FileInputStream(new File(fileDir+"/laokboke.doc"));
FileInputStream in;
HWPFDocument hdt = null;
try {
in = new FileInputStream(new File(filePath));
hdt = new HWPFDocument(in);
} catch (Exception e1) {
e1.printStackTrace();
}
Fields fields = hdt.getFields();
Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN).iterator();
while(it.hasNext()){
System.out.println(it.next().getType());
}
//替换读取到的word模板内容的指定字段
Range range = hdt.getRange();
for (Map.Entry<String,String> entry:map.entrySet()) {
range.replaceText("$" + entry.getKey() + "$",entry.getValue());
}
//输出word内容文件流,提供下载
response.reset();
response.setContentType("application/x-msdownload");
String fileName = ""+System.currentTimeMillis()+".doc";
response.addHeader("Content-Disposition", "attachment; filename="+fileName);
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
OutputStream servletOS = null;
try {
servletOS = response.getOutputStream();
hdt.write(ostream);
servletOS.write(ostream.toByteArray());
servletOS.flush();
servletOS.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
==========================================================================
相关文章推荐
- java用poi实现对word读取和修改操作
- java用poi实现对word读取和修改操作
- java用poi实现对word读取和修改操作
- java用poi实现对word读取和修改操作(转)
- POI实现对word读取和修改操作
- Java 操作 Excel (读取Excel2003 2007,Poi实现)
- java poi操作word模版文件生成表单和修改
- java实现对Excel文件进行创建、读取、修改等操作
- POI实现java从Word中读取数据
- Java 操作 Excel (读取Excel2007,Poi实现)
- java实现在线预览----poi操作word转html及03、07版本兼容问题
- java/poi读取word,并替换word中的文本内容,向word中插入图片的操作
- 最新版java 实现poi方式读取word文件内容
- 【Java工具类】 POI操作word文档模版可修改文字图片
- java POI 修改 读取 word 内容
- Java 操作 Excel (读取Excel2007,Poi实现)
- java 操作 Excel (读取Excel2003 2007,Poi实现)
- java/poi读取word,并替换word中的文本内容,向word中插入图片的操作
- 知识总结-Java 操作 Excel (读取Excel2003 2007,Poi实现)
- Java 操作 Excel (读取Excel2003 2007,Poi实现)