java poi word

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

本文的所有源代码可以通过下载poi实现对word读写操作源代码获得。

1.下载

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

低版本poi生成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的读写操作

整个过程就是先读取模板,然后修改内容,再重新生成新的文档保存到本地或者输出文件流提供下载,下面分别是生成新文档和输出文件流两种方式的代码片断,详细的代码请见附件中的ReadAndWriteDoc.java文件和ReadWriteAndDownloadDocServlet.java两个文件。

生成新文档的方式:

1//读取word模板
2String fileDir = newFile(base.getFile(),"../../../../../doc/").getCanonicalPath();
3FileInputStream in = newFileInputStream(newFile(fileDir+"/laokboke.doc"));
4HWPFDocument hdt = newHWPFDocument(in);
5Fields fields = hdt.getFields();
6Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN).iterator();
7while(it.hasNext()){
8System.out.println(it.next().getType());
9}
10
11//读取word文本内容
12Range range = hdt.getRange();
13System.out.println(range.text());
14//替换文本内容
15for (Map.Entry<String,String> entry:map.entrySet()) {
16range.replaceText(entry.getKey(),entry.getValue());
17}
18ByteArrayOutputStream ostream = new ByteArrayOutputStream();
19String fileName = ""+System.currentTimeMillis();
20fileName += ".doc";
21FileOutputStream out = newFileOutputStream(fileDir+"/"+fileName,true);
22hdt.write(ostream);
23//输出字节流
24out.write(ostream.toByteArray());
25out.close();
26ostream.close();

输出文件流下载方式:

1//读取word模板文件
2String fileDir = newFile(base.getFile(),"../../../../../doc/").getCanonicalPath();
3FileInputStream in = newFileInputStream(newFile(fileDir+"/laokboke.doc"));
4HWPFDocument hdt = newHWPFDocument(in);
5Fields fields = hdt.getFields();
6Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN).iterator();
7while(it.hasNext()){
8System.out.println(it.next().getType());
9}
10
11//替换读取到的word模板内容的指定字段
12Range range = hdt.getRange();
13Map<String, String> map=newHashMap<String, String>();
14map.put("title","老k博客");
15map.put("blog_name","老k博客");
16map.put("domain_name","laokboke.net");
17map.put("description","是一个专注于wordpress、java、gis、建站、网站推广、seo的IT博客。");
18for (Map.Entry<String,String> entry:map.entrySet()) {
19range.replaceText(entry.getKey(),entry.getValue());
20}
21
22//输出word内容文件流,提供下载
23response.reset();
24response.setContentType("application/x-msdownload");
25response.addHeader("Content-Disposition","attachment; filename=\"laokboke.doc\"");
26ByteArrayOutputStream ostream = new ByteArrayOutputStream();
27ServletOutputStream servletOS = response.getOutputStream();
28hdt.write(ostream);
29servletOS.write(ostream.toByteArray());
30servletOS.flush();
31servletOS.close();
欢迎加入我的QQ交流群425783133

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值