使用freemarker按模板导出带表格word文档
使⽤freemarker按模板导出带表格word⽂档
⼀.制作模板
1.将word⽂档制作成以下样式,需要替换的内容放占位符,并按照占位符名字替换数据。表格⾥,使⽤RR.XXX的形式的占位符。RR表⽰当前⾏对象的名字,XXX相当于对象的属性名。写后台的时候,根据这些名将数据存为map,即名字为键值。
例⼦如下:
2.将word另存为xml格式,这⾥因为项⽬需要,我将word保存为.xml 2003。然后将xml⽂件以标签的形式打开,这⾥我使⽤的是⽂本编辑⼯具 Notepad。使⽤Notepad打开时,需要注意使⽤插件将⽂本重新format⼀下,便于修改。这⾥我使⽤的是XML Tools中的Pretty print(XML only - with line breaks),插件⽹上有,直接下就⾏。⽤Notepad打开时的样⼦如下
3.
下⼀步就是在表格数据⾏的位置加⼊list标签,使得表格数据可以循环插⼊,可以把这个标签看做⼀次对list的遍历。在这之前,需要
看看有没有占位符出现空格的标签,保证占位符 例如 ${XM} 这个整体是在⼀起的。
,这⾥图⽅便两个名字我起的⼀样的。
加好之后,在这个数据⾏w:tr 标签结尾处,关闭list标签,这样模板就做完了。
独身⼆.后台⽅法
Action
public void exportSBCL() throws Exception{
try {
Map<String,Object> dataMap = new HashMap<String,Object>();
dataMap = DbInfoById(dbid);
Configuration configuration = new Configuration();
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
//加载需要装填的模板
configuration.Class(),"/com/njzaizao/web/secondRevision/qualityManagement");  //设置对象包装器
configuration.setObjectWrapper(new DefaultObjectWrapper());
//设置异常处理器
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//定义Template对象
Template template = Template("gjxmTmp.ftl");
//输出⽂档
String fileName = "计划申请书.doc";
try {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="
+ new Bytes("GBK"), "ISO-8859-1"));
response.setCharacterEncoding("utf-8");//这句很重要,不加word⾥都是乱码
template.process(dataMap, Writer());
}catch (Exception e) {
e.printStackTrace();
} finally {
response.flushBuffer();
六年级期中考试试卷
}
} catch (Exception e) {
e.printStackTrace();
}
}
Service
public Map<String,Object> getDbInfoById(String dbid){
Map<String,Object> dataMap = new HashMap<String, Object>();
ShortSlab slab = ShortSlabById(dbid);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
dataMap.put("XZMC", XZMC());
dataMap.put("CLSJ", sdf.CLSJ()));
dataMap.put("KTMC", KTMC());
dataMap.put("KTLX", KTLX()!=(KTLX()):"");
dataMap.put("SJZY", SJZY()!=(SJZY()):"");
dataMap.put("HDZDZ", Hdzdz().getXM());
word打开是乱码
dataMap.put("ZDSZGBH",ZDSZGZS()==null?"":ZDSZGZS().getZSBH());
祝老板生意兴隆的词语dataMap.put("LXR", LXR());
dataMap.put("LXFS", LXFS());
dataMap.put("DWMC", OrgInfo().getDEPT_NAME());
String sqlMem = MemebersSql(dbid);
String[] params = new String[] { dbid};
List<Object[]> memList = HibernetUtil.querySQL(sqlMem,params );
List<Map<String ,Object>> members = new ArrayList<>();
for(Object[] objArr:memList){
Map<String ,Object> memMap = new HashMap<>();
memMap.put("PX", objArr[0]);
memMap.put("ZNFG", Util.isNumberic(String.valueOf(objArr[1]))?(String.valueOf(objArr[1])):objArr[1]);  memMap.put("YG_ID", objArr[2]);
memMap.put("NL", objArr[3]);
memMap.put("XM", objArr[4]);
memMap.put("XB",objArr[5]!=(String.valueOf(objArr[5])):"");
String ZYJNXXDJ = objArr[6]!=(String.valueOf(objArr[6])):"";
String ZGZYJSZGDJ = objArr[7]!=(String.valueOf(objArr[7])):"";
memMap.put("XL","");
members.add(memMap);
加班费计算基数}
dataMap.put("XZCY", members);
return dataMap;
摩尔庄园天使种子}
这⾥serveice主要是业务代码,重点是Map⾥的键值,与模板中的对应上就⾏。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。