最近在做java中页面下载word文档,给大家分享一下。
我的环境是MyEclipse10 , JDK1.6 ,Tomcat 6,我这里使用的是FreeMarker。FreeMarker是一个引擎模板。点击了解
FreeMarker。好了,废话不多说直接上代码
一。首先我们需要制作一个ftl模板,这样freemarker才能识别模板
我们新建一个word文档,非常简单的word生成
然后我们将这个word文档另存为xml格式,然后我们用notepad++ 或者其他编辑器打开它
这里使用notepad++ 打开。格式是不存在的我们需要调一下他的格式
们需要通过Plugin Manager进行安装插件。更郁闷的是7.5版本之后notepad++就不带Plugin Manager这一功能了。
当然我么可以通过https://blog.csdn.net/yuan_ren_sheng/article/details/80555430 这里进行下载安装,这里不再阐述
下载好以后我们点击Show Plugin Manager 找到xml Tools进行安装。安装好
通过这里Pretty开头的,我们把xml文件全选。然后随便点Pretty开头的方法。有的人notepad++上面没有XML Tools
格式调好了,然后把他转换成ftl结尾
写一个工具类
package utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
@SuppressWarnings("deprecation")
public class DownUtil {
private static Configuration configuration = null;
private static HashMap allTemplates = null;
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(DownUtil.class,"/ftl/");
/*
* allTemplates = new HashMap<>(); // Java 7 钻石语法
*/
allTemplates = new HashMap();
try {
allTemplates.put("resume", configuration.getTemplate("word3.ftl"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private DownUtil() {
throw new AssertionError();
}
public static File createDoc(Map, ?> dataMap, String type) {
String name = "temp" + (int) (Math.random() * 100000) + ".doc";
File f = new File(name);
Template t = allTemplates.get(type);
try {
// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
t.process(dataMap, w);
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
}
web.xml
HelloWorld
servlet.download
HelloWorld
/HelloWorld
这里直接访问HelloWorld让他触发浏览器下载引擎。
Servlet层
package servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import utils.DownUtil;
public class download extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Map map = new HashMap();
/* Enumeration paramNames = req.getParameterNames();
// 通过循环将表单参数放入键值对映射中
while (paramNames.hasMoreElements()) {
String key = paramNames.nextElement();
String value = req.getParameter(key);
map.put(key, value);
}*/
map.put("topic", "我是标题");
map.put("module", "我是模块");
// 提示:在调用工具类生成Word文档之前应当检查所有字段是否完整
// 否则Freemarker的模板殷勤在处理时可能会因为找不到值而报错 这里暂时忽略这个步骤了
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类WordGenerator的createDoc方法生成Word文档
file = DownUtil.createDoc(map, "resume");
fin = new FileInputStream(file);
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件默认名为resume.doc
resp.addHeader("Content-Disposition","attachment;filename=resume.doc");
out = resp.getOutputStream();
byte[] buffer = new byte[512]; // 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if (fin != null)
fin.close();
if (out != null)
out.close();
if (file != null)
file.delete(); // 删除临时文件
}
}
}