• java用poi实现对word读取和修改操作


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

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

    1.下载

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

    poi37 writeword error 300x143 java用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的读写操作

    整个过程就是先读取模板,然后修改内容,再重新生成新的文档保存到本地或者输出文件流提供下载,下面分别是生成新文档和输出文件流两种方式的代码片断,详细的代码请见下列代码中的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();
            }
            
        }
    }
    ==========================================================================

  • 相关阅读:
    error=Error Domain=NSURLErrorDomain Code=-1003
    修改mac host
    页面之间的跳转效果
    iOS开发200个tips总结(一)
    2020Python练习七——文件处理2
    2020python练习六——文件处理1
    【2020Python错题本】week1错误集
    【2020Python修炼记14】Python语法入门—文件处理
    【2020Python修炼记13】Python语法入门—字符编码
    2013年省赛I题 Thrall’s Dream
  • 原文地址:https://www.cnblogs.com/batys/p/2262392.html
Copyright © 2020-2023  润新知