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<String, Template> allTemplates = null;
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(DownUtil.class,"/ftl/");
/*
* allTemplates = new HashMap<>(); // Java 7 钻石语法
*/
allTemplates = new HashMap<String, Template>();
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
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>servlet.download</servlet-class>
</servlet>
<servlet-mAPPing>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
这里直接访问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<String, Object> map = new HashMap<String, Object>();
/* Enumeration<String> 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(); // 删除临时文件
}
}
}
相关阅读
一:一般为啥要把jsp页面放在WEB-INF呐? 这样主要是为了网站的安全的角度来说的,WEB-INF是安全目录Tomcat 默认的访问路径是W
一、将对象抽象为类首先考虑俄罗斯方块游戏中含有哪些具体的对象,对象中含有哪些具体属性和方法,然后用代码来实现。建立如下类:Cell
/**2.编程题: 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。
JAVA布局模式:GridBagConstraints终极技巧
GridBagConstraints布局,先发一个实例:gridx = 2; // X2gridy = 0; // Y0gridwidth = 1; // 横占一个单元格gridheight = 1; // 列
微信骰子魔术手APP魔术手骰子控制隐形魔术手软件可以3连发5连发6连发任意个数可以录制视频,可以任意控制骰子的点数,想出几就可以出