博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Freemarker + XML 导出Word
阅读量:5873 次
发布时间:2019-06-19

本文共 3915 字,大约阅读时间需要 13 分钟。

hot3.png

1、创建Word模板文档,如

2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如

3、将Word模板文档另存为XML格式,如

4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“”工具打开。

这里要注意两点:①确定你定义的key没有被‘分解’,如果被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。

                     ②如果你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成

很长很长的二进制(看不懂的)代码。正确的写法是,只需要把那些看不懂的代码删掉,写成你定义的key

即可,如本例中的${image}。

以上步骤做完,就可以导出Word文档了。具体代码如下:

/** * @包名 :com.andy.freemarker
* @文件名 :ReportWord.java
* @类描述 :
* @作者 :Andy.wang
* @创建时间 :2014-6-17上午11:49:14
* @更改人 :
* @更改时间 :
*/package com.andy.freemarker;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.OutputStreamWriter;import java.io.Writer;import java.util.HashMap;import java.util.Map;import sun.misc.BASE64Encoder;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;/** * @包名 :com.andy.freemarker
* @文件名 :ReportWord.java
* @类描述 :Freemarker + XML 导出Word
* @作者 :Andy.wang
* @创建时间 :2014-6-17上午11:49:14
* @更改人 :
* @更改时间 :
*/public class ReportWord { private Configuration configuration = null; private Map
dataMap = null; /** * 初始化参数 */ public ReportWord(Map
dataMap) { // TODO Auto-generated constructor stub configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); this.dataMap = dataMap; } /** * * @方法名 :createDoc
* @方法描述 :生成文档
* @创建者 :Andy.wang
* @创建时间 :2014-6-18上午10:23:48
* 返回类型 :void */ public void createDoc(){ // 配置模板所在的包名 configuration.setClassForTemplateLoading(this.getClass(), "/com/andy/freemarker/report"); Template t = null; Writer out = null; // 将模板输入到本地的硬盘上 try { // 加载模板 t = configuration.getTemplate("andy123.ftl"); t.setEncoding("utf-8"); File outFile = new File("d:/hehe.doc"); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); t.process(dataMap, out); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } // 以下代码在Web项目中,输出到页面,弹出”保存“对话框// try {// ActionContext ctx = ActionContext.getContext();// HttpServletResponse response = (HttpServletResponse) ctx// .get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");// response.setContentType("application/msword");// response.addHeader("Content-Disposition", "attachment; filename="// + URLEncoder.encode("hehe.doc", "UTF-8"));// response.setCharacterEncoding("utf-8");// // PrintWriter pout = response.getWriter();// t.process(dataMap, pout);// out.close();// // } catch (TemplateException e) {// e.printStackTrace();// } catch (IOException e) {// e.printStackTrace();// } } /** * * @方法名 :getImageStr
* @方法描述 :将图片转化为二进制流
* @创建者 :Andy.wang
* @创建时间 :2014-6-18上午10:23:00
* @return * 返回类型 :String */ public static String getImageStr() { // 测试,将本机中的图片输出到Word文档中 String imgFile = "d:/qw.jpg"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } public static void main(String[] args) { // 模板的数据源(key就是模板中已定义好的key,value值一定不能为空) Map
dataMap = new HashMap
(); dataMap.put("username", "Andy"); dataMap.put("usersex", "男"); dataMap.put("userbirthday", "1989-6"); dataMap.put("image", getImageStr()); new ReportWord(dataMap).createDoc(); }}

小结:除此之外,导出Word文档,还有jacob(微软)、poi(Apache)、itext、JSP。推荐一篇文档“”,这篇文档中详细地介绍了每种方法的优缺点,

转载于:https://my.oschina.net/andy1989/blog/280960

你可能感兴趣的文章
面试题:判断链表是否存在环
查看>>
sass报 error (Line XX: Invalid GBK character "\xE4") 的解决办法
查看>>
ABP官方文档翻译 1.2 N层架构
查看>>
内置函数与匿名函数
查看>>
转:验证curl_init() 返回 false时..
查看>>
Sitecore操作Media上传图片
查看>>
解决Windows 10下Wireshark运行问题
查看>>
Codeforces Round #392(div 2) 758D (贪心)
查看>>
51nod 1292 字符串中的最大值V2(后缀自动机)
查看>>
svn+http+ad域
查看>>
(转)软件开发和团队”最小模式”初探2-6人模型(下)
查看>>
Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类...
查看>>
win10 应用商店打不开解决
查看>>
GetLastError()返回值及含义
查看>>
The constructor someMethod() is not accessible due to restriction on required library
查看>>
asp.net中异步调用WebService(异步页)[转]
查看>>
转 Android中this、super的区别
查看>>
高数积分总结
查看>>
win10 python 3.7 pip install tensorflow
查看>>
学习面向对象的Javascript的第一步就是要搞清楚两个东西:原型链和作用域链
查看>>