POI 读取 写好的 Word 模板, 并生产新的 word 供用户下载

需求 : 如题
1. 准备 word 模板一份 , 将需要替换的问题 , 使用 ” $ “括起来 ,(也别的符号也行,只是为了替换用)
这里写图片描述
2.apache官网下载 poi , 并导入jar包到工程中
http://poi.apache.org/download.html#POI-3.17
这里写图片描述
3. 编写测试代码
这里写图片描述

package com.jieneng.util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Bookmark;
import org.apache.poi.hwpf.usermodel.Bookmarks;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;


/**
 * @Author wy
 * @Date 2018年3月12日下午3:15:49
 * @Version 1.0
 */
public class POIReadTemUtils {
    public static void main(String[] args) throws Exception {

        InputStream is = new FileInputStream("D:\\temp.doc");
        HWPFDocument doc = new HWPFDocument(is);

        // 返回覆盖整个文档的范围,但不包括任何页眉和页脚。
        Range range = doc.getRange();

        range.replaceText("$projectName$", "xxx酒店");

         doc.write(new FileOutputStream("D:\\new.doc"));

        // 释放资源
        closeStream(is);

    }
    /**
     * 关闭输入流
     */
    private static void closeStream(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 下面方法没用到 , 有需要自己看一下 
    /**
     * 读表格 
     * 每一个回车符代表一个段落,
     * 所以对于表格而言,每一个单元格至少包含一个段落,
     * 每行结束都是一个段落。
     */
    private void readTable(Range range) {
        // 遍历range范围内的table。
        TableIterator tableIter = new TableIterator(range);
        Table table;
        TableRow row;
        TableCell cell;
        while (tableIter.hasNext()) {
            table = tableIter.next();
            int rowNum = table.numRows();
            for (int j = 0; j < rowNum; j++) {
                row = table.getRow(j);
                int cellNum = row.numCells();
                for (int k = 0; k < cellNum; k++) {
                    cell = row.getCell(k);
                    // 输出单元格的文本
                    System.out.println(cell.text().trim());
                }
            }
        }
    }

    /**
     * 输出Range
     */
    private void printInfo(Range range) {
        // 获取段落数
        int paraNum = range.numParagraphs();
        System.out.println(paraNum);
        for (int i = 0; i < paraNum; i++) {
            // this.insertInfo(range.getParagraph(i));
            System.out.println("段落" + (i + 1) + ":"
                    + range.getParagraph(i).text());
            if (i == (paraNum - 1)) {
                this.insertInfo(range.getParagraph(i));
            }
        }
        int secNum = range.numSections();
        System.out.println(secNum);
        Section section;
        for (int i = 0; i < secNum; i++) {
            section = range.getSection(i);
            System.out.println(section.getMarginLeft());
            System.out.println(section.getMarginRight());
            System.out.println(section.getMarginTop());
            System.out.println(section.getMarginBottom());
            System.out.println(section.getPageHeight());
            System.out.println(section.text());
        }
    }

    /**
     * 插入内容到Range,这里只会写到内存中
     */
    private void insertInfo(Range range) {
        range.insertAfter("Hello");
    }
 }
    /**
     * 输出书签信息
     */
    private void printInfo(Bookmarks bookmarks) {
        int count = bookmarks.getBookmarksCount();
        System.out.println("书签数量:" + count);
        Bookmark bookmark;
        for (int i = 0; i < count; i++) {
            bookmark = bookmarks.getBookmark(i);
            System.out.println("书签" + (i + 1) + "的名称是:" + bookmark.getName());
            System.out.println("开始位置:" + bookmark.getStart());
            System.out.println("结束位置:" + bookmark.getEnd());
        }
    }

    /**
     * 读列表
     */
    private void readList(Range range) {
        int num = range.numParagraphs();
        Paragraph para;
        for (int i = 0; i < num; i++) {
            para = range.getParagraph(i);
            if (para.isInList()) {
                System.out.println("list: " + para.text());
            }
        }
    }

4 . 测试成功 , 将我们的 代码部到项目中(我使用的是Struts2)

这里写图片描述

    public void downloadWord() throws Exception {

        String pname = request.getParameter("pname");
        String pdate = request.getParameter("pdate");
        String prate = request.getParameter("prate");
        String pelcprice = request.getParameter("pelcprice");
        String penergy = request.getParameter("penergy");
        String penergy_reduce = request.getParameter("penergy_reduce");
        String preduce_money = request.getParameter("preduce_money");
        String pa_money = request.getParameter("pa_money");
        String pb_money = request.getParameter("pb_money");

        String realPath = request.getSession().getServletContext().getRealPath("/wordTemp/wordTempMode1.doc");

        InputStream is = new FileInputStream(realPath);
        HWPFDocument doc = new HWPFDocument(is);

        // 返回覆盖整个文档的范围,但不包括任何页眉和页脚。
        Range range = doc.getRange();

        range.replaceText("$projectName$", pname);
        range.replaceText("$date$", pdate);
        range.replaceText("$rate$", prate);
        range.replaceText("$actualPrice$", pelcprice);
        range.replaceText("$monthEnergy$", penergy);
        range.replaceText("$monthReduce$", penergy_reduce);
        range.replaceText("$reduceMoney$", preduce_money);
        range.replaceText("$partAMoney$", pa_money);
        range.replaceText("$partBMoney$", pb_money);

        // 解决下载框不显示中文的问题(根据不同的浏览器设置不同的解决方式)
        String filename = "《节能效益分享额确认单》.doc";
        String user_Agent = request.getHeader("User-Agent");
        if(user_Agent.contains("Firefox")){ //解决火狐浏览器下载框不显示中文的问题
            filename = base64EncodeFileName(filename);//火狐使用的是base64编码
        }else{// 解决ie浏览器下载框不显示中文的问题
            filename = URLEncoder.encode(filename, "UTF-8");//ie使用的是url编码
        }

        response.setHeader("Content-Type", "application/ocelet-stream");
        response.addHeader("Content-Disposition", "attachment;filename="+filename+"");

        ServletOutputStream outputStream = response.getOutputStream();
        doc.write(outputStream);
        outputStream.close();
        closeStream(is);
    }

    /**
     * 解决火狐浏览器下载框中文乱码问题
     * @param fileName
     * @return
     */
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 关闭输入流
     */
    private void closeStream(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/diyu122222/article/details/79552371