需求 : 如题
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();
}
}
}