word生成freemarker模板 并下载
java利用freemarker生成word模板,并在网页端下载
java后台生成word技术选型
所用技术 | 优点 | 缺点 |
---|---|---|
Jacob | 功能强大 | 代码量大,设置样式繁琐;需要windows平台支持,无法跨平台 |
Apache POI | 读写excel功能强大、操作简单 | 一般只用它读取word,能够创建简单的word,不能设置样式,功能太少 |
Java2word | 功能强大,操作简单 | 能满足一般要求,不支持07格式,国人开发的,参考资料较多,需要windows平台支持 |
iText | 功能全,能满足一般要求 | 不能直接生成或操作doc文档,只能生成rtf格式的文档,rtf也可以用word打开 |
JSP | 操作简单,代码量少 | 能把当前页面导出简单的word,不能设置样式,美观性差,无法操作word |
XML(最佳) | 代码量少,样式、内容容易控制,打印不变形,完全符合office标准 | 需要提前设计好word模板,把需要替换的地方用特殊标记标出来 |
综上此文以XML为例
java后台生成word是编写好word后,添加占位符,对编辑好的文件另存为xml格式文件。把xml格式文件放入项目中,利用freemarker生成word文件,并下载.
freemarker引入项目
此次用的版本是freemarker-2.3.23.jar
可自行下载,或者maven导入
word生成xml模板
word2010编辑好文档,插入xml语法支持的变量,另存为xml格式文件保存。(word从2003开始支持xml格式,所以从03版word都可以保存为xml格式文档)
编写word
插入变量
word编辑完成,保存为xml格式文档,以我自己使用的word2010为例。
注:如果另存为的xml文件格式乱码,则需要在word中设置为utf-8编码保存。设置保存编码位置:文件-选项-高级-滚动滚轮找到 Web选项并点击进入-选择编码,按如下图进行设置点击确定。此时xml文档编码为utf-8,项目编码也设置为utf-8即可。
word编码设置截图
另保存为xml文件时的截图
改写生成的xml模板
word生成为xml文档后,会出现原本在一起的变量被分开了,如图,此时需将图中蓝色部分删掉。届时模板文件已经做好了。
后台代码
此后台代码为网页端下载word,如需下载到硬盘可另行改写代码
package com.demo.controller;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@Controller
@RequestMapping("/word")
public class wordExcept {
private static Configuration configuration;
static {
configuration = new Configuration();
/** 设置编码 **/
configuration.setDefaultEncoding("utf-8");
}
private ResponseEntity<byte[]> creatWord(HttpServletRequest request, String fileName, Map root) throws IOException {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
String fileDirectory = request.getSession().getServletContext().getRealPath("") + "/doc/";
// String fileDirectory1 ="D:/qqq/qwe/";
FileOutputStream fos = null;
/** 加载文件 **/
Writer out = null;
try {
configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
/** 加载模板 **/
Template template = configuration.getTemplate(fileName + ".xml");
/** 指定输出word文件的路径 **/
File docFile = new File(fileDirectory + fileName + ".doc");
fos = new FileOutputStream(docFile);
out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"), 1024);
try {
template.process(root, out);
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
String docFile = fileDirectory + fileName + ".doc";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName + ".doc");
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(docFile)), headers,
HttpStatus.CREATED);
}
}
调用测试,creatWord方法
第一个request是HttpServletRequest,
第二个数据是模板名称(不含文件后缀名),
第三个是map数据。
@RequestMapping(value = "/download")
public ResponseEntity<byte[]> craeteWord(HttpServletRequest request, HttpServletResponse response) throws IOException {
Map root=new HashMap();//data数据
List reportresult =new ArrayList();
Map rep=new HashMap();
rep.put("test1", "统计设备一");
rep.put("test2", "192.168.6.64");
rep.put("test3", "30");
rep.put("test4", "20");
rep.put("test5", "10");
rep.put("test5", "6");
reportresult.add(rep);
root.put("reportresult", reportresult);
return WordExcept.creatWord(request,"apply",root);
}
前台代码
由于是在网页端下载,所以window.location.href直接调用即可
自此利用freemarker,把word生成的xml文件设置值后下载就完成了。
上一篇: 『为金融数据打标签』「2. 元标签方法」
下一篇: 文章标题
推荐阅读