1、创建Word模板文档,如
2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如
3、将Word模板文档另存为XML格式,如
4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“foxe_CHS.exe”工具打开。
这里要注意两点:①确定你定义的key没有被‘分解’,如果被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。
②如果你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成
很长很长的二进制(看不懂的)代码。正确的写法是,只需要把那些看不懂的代码删掉,写成你定义的key
即可,如本例中的${image}。
以上步骤做完,就可以导出Word文档了。具体代码如下:
/**
* @包名 :com.andy.freemarker<br>
* @文件名 :ReportWord.java<br>
* @类描述 :<br>
* @作者 :Andy.wang<br>
* @创建时间 :2014-6-17上午11:49:14<br>
* @更改人 :<br>
* @更改时间 :<br>
*/
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<br>
* @文件名 :ReportWord.java<br>
* @类描述 :Freemarker + XML 导出Word<br>
* @作者 :Andy.wang<br>
* @创建时间 :2014-6-17上午11:49:14<br>
* @更改人 :<br>
* @更改时间 :<br>
*/
public class ReportWord {
private Configuration configuration = null;
private Map<String, Object> dataMap = null;
/**
* 初始化参数
*/
public ReportWord(Map<String, Object> dataMap) {
// TODO Auto-generated constructor stub
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
this.dataMap = dataMap;
}
/**
*
* @方法名 :createDoc<br>
* @方法描述 :生成文档<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-6-18上午10:23:48 <br>
* 返回类型 :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<br>
* @方法描述 :将图片转化为二进制流<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-6-18上午10:23:00 <br>
* @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<String, Object> dataMap = new HashMap<String, Object>();
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。推荐一篇文档“Java生成Word的几种档案”,这篇文档中详细地介绍了每种方法的优缺点,
来源:oschina
链接:https://my.oschina.net/u/1252840/blog/280960