因为需求要生成复杂的word,所以用模板实现下载
一:首先要创建一个word文档模板,将文档另存为xml格式保存,再把xml格式文件修改后缀为ftl文件。
word文档模板:
转ftl文件:直接将xml文件重命名
二:java后台主要代码
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Newbie on 2018/12/28.
*/
public class WordUtils {
public static File createWord(Map<String, Object> dataMap,String templateName,String filePath) {
//创建文件
String name = (int) (Math.random() * 100000) + ".doc";
File file = new File(filePath + templateName + name);
try {
// 创建配置实例
Configuration configuration = new Configuration();
// 设置编码
configuration.setDefaultEncoding("UTF-8");
// 设置处理空值
configuration.setClassicCompatible(true);
// 设置ftl模板文件加载方式(我是将ftl模板文件放在项目中/resources/template包下的)
configuration.setClassForTemplateLoading(WordUtils.class, "/template");
// 将模板和数据模型合并生成文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
// 获取模板
Template template = configuration.getTemplate(templateName+".ftl");
// 生成文件
template.process(dataMap, out);
// 清空缓存
out.flush();
// 关闭流
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
public static void main(String[] args) {
Map map = new HashMap();
map.put("name","孙俪");
map.put("updateTime","2020-02-27");
map.put("education","博士");
map.put("job","人事经理");
map.put("yearsOfWorking",5);
map.put("age",35);
map.put("address","上海");
map.put("mobile","17625456852");
map.put("email","www.123456@xi.com");
List<Map> list = new ArrayList<>();
Map map1 = new HashMap();
map1.put("startDate", "2010-05-31");
map1.put("endDate", "2014-03-02");
map1.put("schoolName", "清华大学");
map1.put("major", "管理");
map1.put("educationName", "博士");
list.add(map1);
Map map2 = new HashMap();
map2.put("startDate", "2006-05-31");
map2.put("endDate", "2010-03-02");
map2.put("schoolName", "清华大学");
map2.put("major", "管理");
map2.put("educationName", "本科");
list.add(map2);
map.put("educationList",list);
createWord(map, "resume", "D:\\template\\");
}
}
三:编辑ftl文件,获取动态值。
打开文件时无法下手修改,我是用的idea快捷键Ctrl + Alt + L(不区分大小写)将代码格式化,如果无效应该是快捷键冲突了,可以看看是不是网易音乐或者QQ等等其它软件快捷键。格式化之后就很好修改了,支持FreeMarker基本标签。
FTL常用标签及语法:
- 判断对象是否存在 。如: obj可以是任何类型的对象,像集合,实体类,属性等等
<#if obj??>…</#if>
<#if obj??> …<#else>…</#if>
或者
<#if obj?exists>…</#if>
<#ifobj?exists> …<#else>…</#if>- 判断是否和某一个值相等
<#if obj?exists && obj.id==1>…</#if>
<#if obj?exists && obj.id == 1>…<#else>…</#if>
注: 必须先判断是否存在,才可比较相等,如果该指定的参数不存在还比较相等的话就回出错;- 获取对象值
获取普通属性值:${(obj.属性名称)!} 或者 ${属性名称}
获取日期类值:${obj.属性名称?string(“yyyy-MM-dd HH:mm:ss”)}
获取金额类值(以数字20为例):
<#setting number_format=“percent”/> // 设置数字默认输出方式(‘percent’,百分比)
<#assign answer=20/> // 声明变量 answer 20
${answer?string} // 转换字符串输出 4,200%
${answer?string.number} // 转换数字输出 42
${answer?string.currency} // 转换货币输出 ¥42.00
${answer?string.percent} // 转换百分比输出 4,200%- 集合
遍历集合:
<#list empList! as emp>
${emp.name!}
</#list>
.
可以这样遍历集合:
<#list 0…(empList!?size-1) as i>
${empList[i].name!}
</#list>
.
与jstl循环类似,也可以访问循环的状态。
empList?size // 取集合的长度
emp_index: // int类型,当前对象的索引值
emp_has_next: // boolean类型,是否存在下一个对象
.
使用<#break>跳出循环
<#if emp_index = 0><#break></#if>
.
集合长度判断
<#if empList?size != 0></#if> // 判断=的时候,注意只要一个=符号,而不是==
四:最后运行看效果