您的位置:首页 > 编程语言 > Java开发

java 将ftl文件作为模板导出word文档

2018-02-28 16:23 573 查看
一、word文档

1、准备作为模板的word文档(提前设置好结构样式)

2、另存为xml文件(2003)

如下是我准备好的word文档:

会议详情

1.会议名称:${meetingTitle?if_exists?html} //${ meetingTitle}变量也可以这样写,但如果该字段为空时页面将保错,所有在变量后加上?if_exists?html

2.会议发起人:${username?if_exists?html}

3.参与人:${takeParkIn?if_exists?html}

4.会议开始时间:${startTime?if_exists?html}

5.会议地点:${place?if_exists?html}

6.会议内容:${content?if_exists?html}

7.会议纪要:${allSummary?if_exists?html}


红色字体是准备好的test.doc文档的内容,要怎样的样式自己在word里调,打开此word文档,另存为XML格式,即Word XML 文档 (*.xml),保存好后直接重命名将后缀.ftl,文件为test.ftl。

1. html代码:

<span  id="downWord" style="cursor:pointer;" >下载word模板</span>


js代码:

$("#downWord").click(function(){
//点击下载按钮触发的事件
window.location.href = '/meeting/exportWordDoc?meetingId=' + meetingId;  //参数自己定

})


我的项目是基于SpringMVC的,所以前台触发只需要在view层的文件里加个点击事件即可。

2.我的项目是maven项目,直接在pom.xml文件引入freeMarker的包,不是maven项目的话再自己去下载freeMarker的包,然后build path就可以了。

<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.21</version>
</dependency>


3.后台代码:

/***
* 导出Word会议详情
*
* @return
* @throws Exception
*/
@RequestMapping(value = "/exportWordDoc", method = RequestMethod.GET)
@ResponseBody
public void exportMillCertificate(HttpServletRequest request,HttpServletResponse response,String meetingId) throws Exception {

//获得数据,系统相关,就不展示了,下面写死一些数据为例
Map<String, Object> map = new HashMap<String, Object>();//将对象存入map中
map.put("meetingTitle","会议标题");
map.put("username","会议发起人");
map.put("takeParkIn","参会人员");
map.put("allSummary","概要");
map.put("duration","会议持续时间");
map.put("place","会议地点");
map.put("content","会议内容");

WordUtils.exportMillCertificateWord(request,response,map);
}

package com.sinosoft.meetingpass.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.client.utils.DateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;

public class WordUtils {
//配置信息,代码本身写的还是很可读的,就不过多注解了
private static Configuration configuration = null;
//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
private static final String templateFolder = WordUtils.class.getClassLoader().getResource("").getPath()+"/templates/";  //FTL文件所存在的位置
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
} catch (IOException e) {
e.printStackTrace();
}
}

private WordUtils() {
throw new AssertionError();
}

public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
Template freemarkerTemplate = configuration.getTemplate("test.ftl");
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoc(map,freemarkerTemplate);
fin = new FileInputStream(file);

response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
String fileName = "会议详情"+".doc";

//String fileName = "材质单"+DateUtils.curDateTimeStr14() + ".doc";

response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

out = response.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(); // 删除临时文件
}
}

private static File createDoc(Map<?, ?> dataMap, Template template) {
String name =  "f:/test.doc";
File f = new File(name);
Template t = template;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: