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<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();
        }
       
    }
}

java poi 上传与下载word文件相关推荐

  1. java word上传下载_java poi 上传与下载word文件

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  2. 通过Web Services上传和下载图片文件

    通过Web Services上传和下载图片文件 随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而 ...

  3. xshell上传本地文件命令_XShell上传、下载本地文件到linux服务器

    Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz. 首先你的Linux上需要安装安装lrzsz工具包,(如果没有安装请执行以下命令,安 ...

  4. 利用mysql实现上传和下载_文件上传表单 上传文件的细节 文件上传下载和数据库结合...

    1 文件上传表单 1)上传文件的本质是文本复制的过程 2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写 3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方式,例如: IE6 ...

  5. 上传和下载歌曲文件(C#)

    第一次项目实训的时候是做的一个基于Silverlight的泡泡点歌系统,我负责做的是管理员部分(做的有点类似于一个客户端,用WPF写的),其间用到的有歌曲的上传和下载功能. 在网上找了很多关于歌曲上传 ...

  6. java中文件的上传和下载:文件上传和下载原理

    在TCP/IP中,我们知道最早的上传机制为FTP,它是指将文件由客户端发送到服务器的标准机制.然而我们在jsp编程中不能使用FTP来上传文件,这是由于jsp运行机制决定的.               ...

  7. java jxl上传excel_JAVA JXL -----excel文件上传和解析

    Java 操作EXCEL 有比较常见的方法 一是使用开源JXL组件,另外一种是POI,POI相对应用更广泛,能够操作微软所有windows文档,但数据量大的情况下比较消耗内存,所以相对效率比较低. 这 ...

  8. java mime上传_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  9. poi 上传Excel如何处理大文件,避免内存溢出

    使用poi做上传时,使用一般的形式,用户模式:new WorkBook()时,代码简单易懂,但是这种方式只能操作小文件,遇到大的文件就会报内存溢出的错.有问题就要解决,下面分享几种解决方式 第一种:只 ...

最新文章

  1. Java笔记整理-02.Java基础语法
  2. MSDE2000的安装方法
  3. 每周论文清单:高质量文本生成,多模态情感分析,还有一大波GAN | PaperDaily #26
  4. Linux学习之系统编程篇:信号的基本概念
  5. 假如生活欺骗了你!——Leo网上答疑(14)
  6. 触发事件_黑暗的三天之触发事件
  7. Python根据字符分组数量判断密码安全强度
  8. 打印表格_Excel表格打印技巧,让你分分钟打印出完美表格!建议收藏!
  9. leetcode-Easy-第1期:two sum
  10. 开源的IDE?还真是头一次见!Github标星30.7K!值得拥有!
  11. Windows 7下硬盘安装Ubuntu 14.10图文教程【硬盘安装】
  12. 批量将点shp转成线shp
  13. retrievefile文件字节为0_linux环境下下 FTPClient.retrieveFile() 下载稍大一点的文件就卡死了-问答-阿里云开发者社区-阿里云...
  14. 研发管理 - 流程篇
  15. 网页加速优化简单总结
  16. win7高级搜索计算机,使用win7系统高级搜索功能的方法介绍
  17. cmd看控制台输出红桃、方块、黑桃、梅花乱码解决
  18. windows xp系统本地连接提示受限制或无连接怎么办
  19. H2O自动化机器学习框架介绍与搭建笔记
  20. DOCTYPE 的作用是什么

热门文章

  1. 剪辑视频,去除视频水印的操作方法
  2. 重回童年的经典系列☀️|【炸弹人小游戏】制作过程+解析 | 收藏起来跟曾经的小伙伴一起梦回童年!
  3. “3.15”打假 | 李鬼冒充李逵,警惕5G项目骗局!
  4. 与信号压缩斗到底:光纤VPM技术解4K 60Hz传输架构与带宽之痛
  5. Honeycomb Renderscript 详解
  6. Xposed插件的使用(一)进行简单的Hook
  7. 十分钟理解javascript中的this对象
  8. 师古创今匠心品质,打造红木中式整装
  9. 微处理器(STM32 wifi芯片)实现音频回声消除
  10. vue弹出框组件封装