使用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();        }        }    }}


 

4、控制类

 

    @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
原创粉丝点击