使用freemarker 导出word供别人下载

公司做项目需要一个功能,要求如下,

 

把符合条件的一个列表list 导出成word,以供别人下载。

开始想使用poi 进行操作表,思来想去,对这个还是不熟悉,

也想用jacob进行操作,也不是很理想,上google的一把,找到了

http://blog.csdn.net/myyate/archive/2008/01/17/2049701.aspx

写的文章,感觉不错,于是写了一个demo,作为一个代码的集累吧。

同时,也谢谢上文件作者。

示例结合struts2 编写的, word模 版文件要保存成mht 格式。

 

代码如下:

结构图如下:
StaticFreemarker.java  主要用于生成word文件
package com.jr.cont; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Locale; import java.util.Map; import org.apache.struts2.ServletActionContext; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; /**使用freemarker 生成word */ public class StaticFreemarker { /*** * @param ftl 模版名称 * @param htmlName 生名word后的名称 * @param map 数据集合map * @param fileName 文件夹名称 * @throws IOException * @throws TemplateException */ public void init(String ftl, String htmlName, Map map, String fileName) throws IOException, TemplateException { Configuration freemarkerCfg = new Configuration(); freemarkerCfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(), "/" + fileName); freemarkerCfg.setEncoding(Locale.getDefault(), "gbk"); Template template; template = freemarkerCfg.getTemplate(ftl); template.setEncoding("gbk"); String path = ServletActionContext.getServletContext().getRealPath("/"); System.out.println(path); BufferedWriter buff = new BufferedWriter(new FileWriter(path + htmlName)); File htmlFile = new File(path + htmlName); Writer out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(htmlFile), "gbk")); template.process(map, out); buff.close(); out.flush(); out.close(); } }  ExportWordAction 用于页面请求生成事件
package com.jr.cont; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.opensymphony.xwork2.ActionSupport; import freemarker.template.TemplateException; /**生成word 的action*/ public class ExportWordAction extends ActionSupport { private static final long serialVersionUID = 7934795621981455907L; @SuppressWarnings("unchecked") @Override public String execute() { StaticFreemarker sf = new StaticFreemarker(); List<Target> target = new ArrayList<Target>(); Target tar ; /**假设数据*/ for(int i=1;i<=100;i++){ tar= new Target(); tar.setId(i); tar.setName1("name"+i); tar.setName2("name"+i); tar.setName3("name"+i); tar.setName4("name"+i); tar.setName5("name"+i); target.add(tar); } Map map = new HashMap(); map.put("list", target); String htmlfile2 = "数据报告.mht.doc"; try { sf.init("数据报告.mht.ftl", htmlfile2, map, "doc"); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return SUCCESS; } }  DownloadAction 用于生成的文件下载 
package com.jr.cont; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /***下载word的action*/ public class DownloadAction extends ActionSupport { private static final long serialVersionUID = 8448176878783491691L; @Override public String execute() throws Exception { HttpServletResponse resp = ServletActionContext.getResponse(); String path = ServletActionContext.getServletContext().getRealPath("/"); String filename = "数据报告.mht.doc"; //生成文件的文件名称 这个需要动态的获取 OutputStream out;//输出响应正文的输出流 InputStream in;//读取本地文件的输入流 //获得本地输入流 File file = new File(path + filename); in = new FileInputStream(file); //设置响应正文的MIME类型 resp.setContentType("Content-Disposition;charset=GB2312"); resp.setHeader("Content-Disposition", "attachment;" + " filename="+ new String(filename.getBytes(), "ISO-8859-1")); //把本地文件发送给客户端 out = resp.getOutputStream(); int byteRead = 0; byte[] buffer = new byte[512]; while((byteRead = in.read(buffer)) != -1) { out.write(buffer, 0, byteRead); } in.close(); out.close(); return null; } }  struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="export" class="com.jr.cont.ExportWordAction"> <result name="success">/success.jsp</result> </action> <action name="download" class="com.jr.cont.DownloadAction"></action> </package> </struts>  
效果图:
下载效果图:
源码我会打包上传到我的资源里...
以上代码未进行中文的处理,现在补上,下载的文件不知道怎么进和地修改了,
package com.jr.cont; /**编码工具类 把需要放到 freemark 中的中文进行编码*/ public class StringUtils { /** * 把给定的str转换为10进制表示的unicode,格式为:姨 目前只是用于mht模板的转码 * @param str * @return */ public static String encode2HtmlUnicode(String str) { if (str == null) return ""; StringBuilder sb = new StringBuilder(str.length() * 2); for (int i = 0; i < str.length(); i++) { sb.append(encode2HtmlUnicode(str.charAt(i))); } return sb.toString(); } public static String encode2HtmlUnicode(char character) { if (character > 255) { return "&#" + (character & 0xffff) + ";"; } else { return String.valueOf(character); } } public static String encode2HtmlUnicode(Character character) { if (character == null) return null; return encode2HtmlUnicode(character.charValue()); } public static void encode2HtmlUnicode(String[] value) { if (value == null || value.length < 1) return; for (int i = 0; i < value.length; i++) { value[i] = encode2HtmlUnicode(value[i]); } } }  

需要中文件编码的字符可以如下使用

StringUtils.encode2HtmlUnicode("姓名");

对英文没有任何影响。

 

转载于:https://www.cnblogs.com/java20130726/archive/2011/03/18/3218388.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值