使用freemarker导出word
最近需要将jsp部分页面导出为word文件,环境是Spring+SpringMVC+Hibernate。
我使用的是FreeMarker模板引擎来完成。这是FreeMarker的中文参考手册,感兴趣的看一下。http://freemarker.foofun.cn/
好啦,接下来正式动手之前我们需要把相应的jar包下载好并导入,下面是最新的链接。
https://freemarker.apache.org/freemarkerdownload.html
我们要做的事情其实很简单,准备一个word模板,编写Controller文件,编写DocUtil工具类 以及提供导出的test.jsp。
1.我们先新建一个需要导出的word文档,在插入数据的地方用${数据}的形式替代,例如这样

我们创建好了需要后另保存为xml格式。

打开test.xml大约是这样,

注意:有时候因为排版的问题,可能${数据}会被拆开,我们调整一下就好。
之后另存为ftl文件,我们的模板文件就完成了,再放在我们的项目目录下就好了,这里我在项目根目录下创建了freemarker.template文件夹来存放模板。

2.现在可以开始编写DocUtil工具类了,我就直接直接贴代码了。
package com.rsp.core.util;
import java.io.*; import freemarker.template.Template; import freemarker.template.Configuration; import java.util.HashMap;
import java.util.Map; public class DocUtil {
private static Configuration configuration = null;
private static Map<String, Template> allTemplates = null; static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(DocUtil.class, "/freemarker/template");
allTemplates = new HashMap<>();
try {
allTemplates.put("test", configuration.getTemplate("test.ftl"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} private DocUtil() {
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;
} }
3.Controller类方法
@RequestMapping(value="/exportWord")
@ResponseBody
public void exportword(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);
}
DocUtil doc=new DocUtil();
File file=null;
InputStream fin=null;
ServletOutputStream out=null;
try {
file=DocUtil.createDoc(map,"test");
fin = new FileInputStream(file);
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件默认名为test.doc
resp.addHeader("Content-Disposition", "attachment;filename=test.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();
} }
4.test.jsp,注意这里的name属性要与word里的数据名一样,不然会报错。
<form name="mainform" action="${pageContext.request.contextPath}/news/exportWord" method="post">
<div id="main-box">
<div class="title"> 个人信息 </div> <div class="body">
<p>姓名:<input name="name"type="text" style="width: 301px;"></p>
<p>性别:<input name="sex" type="text" style="width: 301px;"></p>
<p>年龄:<input name="age" type="text" style="width: 301px;"></p>
<input type="submit" value="导出">
</div>
</form>
好了,至此基本就完成了。还有图片的插入也很简单,这里就不多说了。
使用freemarker导出word的更多相关文章
- freemarker导出word带图片
导出word带图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:nam ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
- freemarker导出word档
1.word另存为xml:2.xml文件后缀名改成ftl:3.编写完整json字符串备用:4.修改ftl中动态字段为json中对应字段名:5.编写java代码自动生成word文件:(注意:换行用< ...
- freemarker导出word的一些问题
首先,了解下freemarker导出word的流程: 参考https://www.cnblogs.com/llfy/p/9303208.html 异常一: freemarker.core.ParseE ...
- 关于使用freemarker导出word
java使用FreeMarker导出word 一. 先做一个word模板 二. 将该word文件另存为xml格式(注意是另存为,不是直接改扩展名) 三. 打开xml文件把要 ...
- 使用Freemarker导出Word文档(包含图片)代码实现及总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- java freemarker导出word时添加或勾选复选框
最近项目导出word碰到一个需求,要求根据数据动态的决定word里的复选框是否勾选, 公司导出word用的是freemarker,相比较其他技术,freemarker可以很容易的控制输出样式, 在wo ...
- Java用freemarker导出word
概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...
- spring boot freemarker 导出word 带echarts图形报表
创建word文件内容如下 将word导出为xml格式 将文件后缀名改为 .ftl 在springboot项目中添加freemarker依赖 <!-- 导出word文档--> <dep ...
随机推荐
- 10.18JS日记
1.JS的本质就是处理数据,数据来自后台的数据库,所以变量起到了临时存储的作用, ES制定了js的数据类型 2.数据类型有哪些? (1)字符串 String (2)数字 Number (3)布尔 B ...
- 单元测试使用spring注解获取bean
在实际项目开发中经常会有单元测试,单元测试中经常会用类似这样的代码片段获取spring管理的bean @Test public void testSendEmail(){ MessageService ...
- IIS7中的站点、应用程序和虚拟目录详细介绍
IIS7中的站点.应用程序和虚拟目录详细介绍 这里说的不是如何解决路径重写或者如何配置的问题,而是阐述一下站点(site),应用程序(application)和虚拟目录 (virtual direct ...
- sed删除行
删除文件中含有$word字符串的某些行(在文件中修改) sed -i '/$word/d' file
- libpcap 库使用(二)
参考资料: http://www.tcpdump.org/manpages/pcap.3pcap.html 分类介绍了该lib的函数 Opening a capture handle for read ...
- Clover相关知识
-f 重建驱动缓存 darkwake=4 有深度睡眠有关的设置,不懂 kext-dev-mode=1 启用第三方驱动,比较重要. dart=0 修复因开启 VT-d 导致系统启动时SMC五国错误,系统 ...
- javase高级技术 - 反射
在说反射之前,必须得先说说java的类加载器,类加载器的定义:将.class文件加载到内在中,并为之生成对应的Class对象. 一般有三种 1 Bootstrap ClassLoader 根类加载器也 ...
- javabean为什么需要序列化
无论用hibernate或者mybatis结合spring做开发还是其他,系统里持久类往往要实现序列化, implements Serializable.我还是比较好奇,为什么要这样做呢?一直只知道个 ...
- windows 8 update to windows 8.1
可以参考以下几个链接: http://blogs.windows.com/windows/b/appbuilder/archive/2013/07/24/windows-8-to-windows-8- ...
- 【Git】 GitLab服务器社区版安装与配置
GitLab简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 GitLab系统架构 当~git在图片中引用时,它表示git用户的主目录 ...