1.pom.xml配置freemarker依赖包
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
2.打开word模版文件,另存为.xml格式,然后将.xml文件后缀改为.ftl,引入.ftl模板文件到项目指定目录
3.编写生成Word工具类
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class DcWordUtil {
public static void download(HttpServletRequest request,HttpServletResponse response,String newWordName,Map dataMap) {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(DcWordUtil.class, "/templates");//模版文件的存放路径
Template t = null;
try {
//读取模版文件
t = configuration.getTemplate("word.ftl","utf-8");
} catch (Exception e) {
e.printStackTrace();
}
File outFile = null;
Writer out = null;
String filename = newWordName;
try {
outFile = new File("word.doc");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (Exception e) {
e.printStackTrace();
}
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
InputStream fis = null;
OutputStream toClient = null;
try {
fis = new BufferedInputStream(new FileInputStream(outFile));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
filename = URLEncoder.encode(filename, "utf-8");//要用URLEncoder转下才能正确显示中文名称
response.addHeader("Content-Disposition", "attachment;filename=" + filename+"");
response.addHeader("Content-Length", "" + outFile.length());
toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
} catch (Exception e) {
} finally{
try {
if(toClient!=null){
toClient.close();
}
} catch (Exception e) {
}
try {
if(fis!=null){
fis.close();
}
} catch (IOException e) {
}
}
}
}
4.业务层调用
@RequestMapping("/exportWord")
public String exportWord(Model model,HttpServletRequest request,HttpServletResponse response) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("导出开始时间:"+format.format(new Date()));
List<Map<String, Object>> list = jkconfigDao.exportWord();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("list", list);
String title = "测试.doc";
DcWordUtil.download(request, response, title, dataMap);
System.out.println("导出结束时间:"+format.format(new Date()));
return null;
}
5.ftl文件通过表达式获取值
List集合遍历:<#list list as list> 第一个list 不能变 ,第二个list 为变量名 ,第三个list 为别名,遍历结束加上</#list>
List集合遍历获取索引:${list_index}
List集合遍历拼接索引动态取值:${list['qq${list_index}']}
Map集合取值:${list.name}
IF判断:<#if list_index*3+1 <= qqcount>${list_index*3+1}</#if>