java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob、poi等, 而poi应用得最为广泛。

对word2003和2007的读和写word操作都十分方便。

它是Apache组织的一个项目,早在2001年就已经发布了第 一个版本,可以说是apache组织的一个老牌项目,到现在已经走过了10年光辉历程,目前最新版本是3.8的beta版本。下面就以该版本来演示如何实 现对word进行读取和改写值操作。 

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


1.下载

  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模板 

  1. 把需要变动的值全部用代码来代替,例如你需要改变名称的值,则可以在模板中用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();  
        }  
          
    }  
}  






Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐