java用poi实现对word读取和修改操作 |
您所在的位置:网站首页 › poi读取word文档内容 › java用poi实现对word读取和修改操作 |
java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob、poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便。它是Apache组织的一个项目,早在2001年就已经发布了第 一个版本,可以说是apache组织的一个老牌项目,到现在已经走过了10年光辉历程,目前最新版本是3.8的beta版本。下面就以该版本来演示如何实 现对word进行读取和改写值操作。 poi的源代码可以通过下载 poi源码 获得。 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 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 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(),"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 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(); } }}========================================================================== |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |