FreeMarker(XML模板)导出word
2015-08-16 15:11
447 查看
在项目中使用它完成的功能是按照固定的模板将数据导出到Word。比如台账。在完成后将处理过程按照台账的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变。
这个功能就是由XML+Freemarder来实现的,Word从2003开始支持XML格式,大致的步骤:用office2003或者以上的版本编辑 好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
一、模板的制作
先用Word做一个模板,如下图:
然后另存为XML文件,可以利用高亮显示的notepad++打开xml,主要是有高亮显示,和元素自动配对
也可以用foxe_CHS打开xml,是一个简洁、快速的 XML 编辑器,还提供F8对齐排版功能。
保存后,修改后缀名为ftl,至此模板制作完毕。
二、编程实现
首先引入freemarker的开源包
编写java类,主要实现对模板的赋值以及生成流,用于导出。
三、生成的Word结果如下:
对于复杂的报表样式可以在Word中编辑后保存,如果需要输出列表类型数据可以参考Freemarker的循环或逻辑控制。
四、总结
这个工具生成word确实很方便,但是还是有些不足的地方,FreeMarker三宗罪->http://www.iteye.com/topic/17468
转载自:http://blog.csdn.net/xiexl/article/details/6747767
这个功能就是由XML+Freemarder来实现的,Word从2003开始支持XML格式,大致的步骤:用office2003或者以上的版本编辑 好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
一、模板的制作
先用Word做一个模板,如下图:
然后另存为XML文件,可以利用高亮显示的notepad++打开xml,主要是有高亮显示,和元素自动配对
也可以用foxe_CHS打开xml,是一个简洁、快速的 XML 编辑器,还提供F8对齐排版功能。
保存后,修改后缀名为ftl,至此模板制作完毕。
二、编程实现
首先引入freemarker的开源包
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;
编写java类,主要实现对模板的赋值以及生成流,用于导出。
package com.test.freemarker.report; 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.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class DocumentHandler { private Configuration configuration = null; public DocumentHandler() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } public void createDoc() { // 要填入模本的数据文件 Map dataMap = new HashMap(); getData(dataMap); // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载, // 这里我们的模板是放在com.havenliu.document.template包下面 configuration.setClassForTemplateLoading(this.getClass(), "/com/test/freemarker/report"); Template t = null; try { // test.ftl为要装载的模板 t = configuration.getTemplate("test.ftl"); t.setEncoding("utf-8"); } catch (IOException e) { e.printStackTrace(); } // 输出文档路径及名称 File outFile = new File("D:/test.doc"); Writer out = null; try { FileOutputStream fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter( fos,"UTF-8");//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。 out = new BufferedWriter(oWriter); /** out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); **/ } catch (Exception e1) { e1.printStackTrace(); } try { t.process(dataMap, out); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 注意dataMap里存放的数据Key值要与模板中的参数相对应 * @param dataMap */ private void getData(Map dataMap) { dataMap.put("title_name", "用户信息"); dataMap.put("user_name", "张三"); dataMap.put("org_name", "微软公司"); dataMap.put("dept_name", "事业部"); } }
三、生成的Word结果如下:
对于复杂的报表样式可以在Word中编辑后保存,如果需要输出列表类型数据可以参考Freemarker的循环或逻辑控制。
四、总结
这个工具生成word确实很方便,但是还是有些不足的地方,FreeMarker三宗罪->http://www.iteye.com/topic/17468
转载自:http://blog.csdn.net/xiexl/article/details/6747767
相关文章推荐
- Zball in Tina Town
- c++的引
- iPhone6/6Plus下app状态栏内容放大问题处理
- UIImage获取本地图片的方式对内存的影响
- STM32 TFT学习笔记——触摸屏
- ffplay for mfc 代码备忘
- 大数据潮流下的企业预测与决策思考
- codeforces 567 F. Mausoleum (dp)
- java特种兵 学习日志1
- hdu 2544 最短路(dijkstra)
- Codeforces Round #313 (Div. 2)-B. Gerald is into Art
- 【HNOI2010】【BZOJ2002】Bounce 弹飞绵羊
- 15.4——构造函数与复制控制
- Codeforces Round #316 (Div. 2) D. Tree Requests
- 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEvent(图文)!
- 第86讲:Scala中For表达式的生成器、定义和过滤器
- 75 Sort Colors
- RedHat Enterprise Linux7.0安装Oracle12c
- FxMaker用法
- 网络编程TCP(五)