使用freemark导出数据到Word(遍历List)
来源:互联网 发布:javascript 书籍 编辑:程序博客网 时间:2024/05/16 12:05
1、根据word编辑模板如下:
2、将该模板另存为xml文件,进而重命名为.ftl文件,就得到了freemark的模板,因为是一个列表显示,我们需要所以我们需要根据freemark的标签进行改写,找到word中的每一个表格的行进行改写,改写后的ftl的文件如下:
3、导出工具类
package org.nercita.bcp.word.util;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.net.URLEncoder;import java.util.Map;import javax.mail.internet.MimeUtility;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;/** * The <code>WordExportUtil</code> class is a util class for word export. * 工具类:实现根据freemark 模板导出word文件 * @author zhangwenchao * @since Sample1.0 */public class WordExportUtil { public static String WORD_2007 = "WORD_2007"; public static String WORD_2003 = "WORD_2003"; /** * 设置下载文件中文件的名称 * @param filename * @param request * @return */ public static String encodeFilename(String filename, HttpServletRequest request) { String agent = request.getHeader("USER-AGENT"); try { if ((agent != null) && (-1 != agent.indexOf("MSIE"))) { String newFileName = URLEncoder.encode(filename, "UTF-8"); newFileName = StringUtils.replace(newFileName, "+", "%20"); if (newFileName.length() > 150) { newFileName = new String(filename.getBytes("GB2312"), "ISO8859-1"); newFileName = StringUtils.replace(newFileName, " ", "%20"); } return newFileName; } if ((agent != null) && (-1 != agent.indexOf("Mozilla"))) return MimeUtility.encodeText(filename, "UTF-8", "B"); return URLEncoder.encode(filename, "UTF-8"); } catch (Exception ex) { return filename; } } /** * * @param request HttpServletRequest * @param response HttpServletResponse * @param version Word_2003/Word_2007 * @param docFileName 生成的doc临时文件名 * @param templateFile freemark模板文件名 * @param beanParams 入参数据: Map<String, Object>类型 */ public static void writeResponse( HttpServletRequest request, HttpServletResponse response, String version, String docFileName, String templateFile, Map<String, Object> beanParams) { writeResponse(request, response, version, "temp", docFileName, "template", templateFile, beanParams); } /** * * @param request HttpServletRequest * @param response HttpServletResponse * @param version Word_2003/Word_2007 * @param docTempDir 生成的doc临时文件目录 * @param docFileName 生成的doc临时文件名 * @param templateDir 存放freemark模板的目录 * @param templateFile freemark模板文件名 * @param beanParams 入参数据: Map<String, Object>类型 */ public static void writeResponse( HttpServletRequest request, HttpServletResponse response, String version, String docTempDir, String docFileName, String templateDir, String templateFile, Map<String, Object> beanParams) { Configuration config = new Configuration(); ServletContext sc = request.getSession().getServletContext(); InputStream is = null; File previewFile = null; try { config.setDirectoryForTemplateLoading(new File(sc.getRealPath("/"+templateDir))); config.setObjectWrapper(new DefaultObjectWrapper()); Template template = config.getTemplate(templateFile, "UTF-8"); if (WORD_2007.equals(version)) { docFileName = encodeFilename(docFileName + ".docx", request); } else { docFileName = encodeFilename(docFileName + ".doc", request); } String docName = request.getSession().getServletContext().getRealPath("/"+docTempDir)+docFileName; FileOutputStream fos = new FileOutputStream(docName); Writer out = new OutputStreamWriter(fos, "UTF-8"); template.process(beanParams, out); out.flush(); out.close(); previewFile = new File(docName); is = new FileInputStream(previewFile); response.reset(); if (WORD_2007.equals(version)) { response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"); }else{ response.setContentType("application/vnd.ms-word;charset=UTF-8"); } response.addHeader("Content-Disposition", "attachment;filename="+docFileName); byte[] b = new byte[1024]; int len; while ((len=is.read(b)) >0) { response.getOutputStream().write(b,0,len); } response.getOutputStream().flush(); response.getOutputStream().close(); } catch (Exception e) { e.printStackTrace(); }finally{ if(is!=null){ try {is.close();} catch (IOException e) {e.printStackTrace();} } if(previewFile!=null){ previewFile.delete(); } } }}
@RequestMapping("/test/word/export") public void exportWord(HttpServletResponse response,HttpServletRequest request) throws IOException{ Map<String, Object> beanParams = new HashMap<String, Object>(); List<User> userList = new ArrayList<User>(); for(int i=0;i<10;i++){ User u = new User(); u.setName("ZhangSan"+i); u.setRealName("张三"+i); u.setCompany("xx公司"+i); u.setPhone("130xxxxxxxx"+i); userList.add(u); } beanParams.put("title", "用户信息"); beanParams.put("userList", userList); beanParams.put("attention", "请注意确保所有信息的正确性"); WordExportUtil.writeResponse(request, response, WordExportUtil.WORD_2003, "用户信息列表导出", "templateFile.ftl", beanParams); }
5、运行结果
0 0
- 使用freemark导出数据到Word(遍历List)
- 在java中使用FreeMark导出数据到excel表格
- freemark-----------list(list,map遍历)
- 在SSH2项目中实现使用Freemark导出Word文档
- Freemark实现Java导出Word
- 下载 word(freemark遍历. ftl)
- 使用freeMark生成word
- freeMark中遍历list集合
- java freemark导出word 实现word分页
- 数据 导出到Word 、excel
- 导出数据到Excel/Word
- C# 导出数据到Word
- NPOI导出数据到Word
- Java使用freemark生成word
- GridView数据导出到Word/Excel中
- 中导出数据到WORD中
- asp.net数据导出到word
- asp.net数据导出到word
- Android6.0 PKMS的mSettings,mPackages变量分析
- 交叉编译
- PHP开发笔试题及答案(一)
- NSSet和NSMutableSet
- Migrate the switch code to if-else
- 使用freemark导出数据到Word(遍历List)
- supervise系统进程监控
- ORACLE字符类型详解----char、nchar、varchar、varchar2、nvarchar2
- App架构经验总结(转)
- HTTPClient与HttpURLConnection的区别
- 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
- zzulioj 1209: 东东的女朋友(一)
- ARM Introduction
- 由web程序出现乱码开始挖掘(Bom头、字符集与乱码)