1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java poi读取word中附件_java用poi实现对word读取和修改操作

java poi读取word中附件_java用poi实现对word读取和修改操作

时间:2018-12-01 09:16:35

相关推荐

java poi读取word中附件_java用poi实现对word读取和修改操作

java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob、poi等, 而poi应用得最为广泛,对word和的读和写word操作都十分方便。它是Apache组织的一个项目,早在2001年就已经发布了第 一个版本,可以说是apache组织的一个老牌项目,到现在已经走过了光辉历程,目前最新版本是3.8的beta版本。下面就以该版本来演示如何实 现对word进行读取和改写值操作。

poi的源代码可以通过下载poi源码获得。

1.下载

下载3.8beta4版本,请记得一定要下载该版本,其他版本读取word模板并改写内容生成新的文件后,打开新文件时会提示“word无法读取文档,文档可能损坏。”,见下图

低版本poi生成word文档打开时的错误

2.集成到项目

这一步很简单,只要把下载后解压得到的poi-3.8-beta4-0826.jar和poi-scratchpad-3.8-beta4-0826.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 map){

//读取word模板

// String fileDir = new File(base.getFile(),"//../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 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 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 map){

//读取word模板文件

// String fileDir = new File(base.getFile(),"//../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 it = fields.getFields(FieldsDocumentPart.MAIN).iterator();

while(it.hasNext()){

System.out.println(it.next().getType());

}

//替换读取到的word模板内容的指定字段

Range range = hdt.getRange();

for (Map.Entry 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();

}

}

}

==========================================================================

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。