• Freemaker基于word模板动态导出


    学习自:https://www.cnblogs.com/lsy-blogs/p/9243281.html

    一、使用的jar包:

     

    二、Word模板动态导出的基本思路:

    1、首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容的地方填写${},大括号内为后台传递进来的参数名,然后将该模板另存为xml格式;

    2、对xml格式文件进行适当的修改:

    (1)修改${}所在的位置,让${}在一个标签内,因为替换值是根据${}进行识别的,因此必须让${}在一个标签内:

     

    (2)如果有需要循环输出的,需要添加<#list></>标签,类似于增强for循环,无论是表格还是文字只要是需要循环输出的,只要找好循环输出数据的标签,然后用<#list></>扩住,然后修改对应的循环输出数据的${}参数名即可:

     

    三、使用freemaker实现word模板动态导出基本步骤:

    1、项目中引入freemaker引擎的jar包:

     

    2、将freemaker导出word的工具类放入项目中,并修改对应的word的xml模板所在的路径和名称:

     

    3、编写代码,获取word中需要的对应的数据,最终存储到一个map中去(参数名必须要与word模板xml中对应的参数名保持一致):

     

     

    4、编写总方法,将map中的结果数据传递给工具类中的方法,实现word导出;

     

    5、通过以上几个步骤,变可以实现对word的动态导出。

    四、需要注意的事项:

    1、word模板xml中的${}一定要放在同一个标签中;

    2、如果有需要循环输出的数据,在后台中每一条数据一定是放在一个对象中,不要放在一个map中,循环输出的数据在后台是存储在一个list对应集合中;

    3、后台给word模板传递参数只能传递一个map参数,因此无论是单个参数还是list对象集合,最终都整合在一个map中进行存储;

    4、后台传递给word模板中的参数,不要为null,如果是不存在的值,那么就传递空字符串,也不要传递null进来。

    五、word导出工具类代码如下:

    复制代码
    package com.jeecg.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.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    
    public class WordUtils { // 配置信息,代码本身写的还是很可读的,就不过多注解了
        private static Configuration configuration = null;
        // 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
        private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath()
                + "export/template/";
        static {
            configuration = new Configuration();
            configuration.setDefaultEncoding("utf-8");
            try {
                configuration.setDirectoryForTemplateLoading(new File(templateFolder));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private WordUtils() {
            throw new AssertionError();
        }
    
        public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String fileName)
                throws IOException {
            Template freemarkerTemplate = configuration.getTemplate("TMCatalogMainTemplateBatchDown.xml");
            File file = null;
            InputStream fin = null;
            ServletOutputStream out = null;
            try {
                // 调用工具类的createDoc方法生成Word文档
                file = createDoc(map, freemarkerTemplate);
                fin = new FileInputStream(file);
    
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/msword");
                // 设置浏览器以下载的方式处理该文件名
                fileName = fileName+".doc";
                response.setHeader("Content-Disposition",
                        "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
    
                out = response.getOutputStream();
                byte[] buffer = new byte[512]; // 缓冲区
                int bytesToRead = -1;
                // 通过循环将读入的Word文件的内容输出到浏览器中
                while ((bytesToRead = fin.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            } finally {
                if (fin != null)
                    fin.close();
                if (out != null)
                    out.close();
                if (file != null)
                    file.delete(); // 删除临时文件
            }
        }
    
        private static File createDoc(Map<?, ?> dataMap, Template template) {
            String name = "test.doc";
            File f = new File(name);
            Template t = template;
            try {
                // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
                Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
                t.process(dataMap, w);
                w.close();
            } catch (Exception ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex);
            }
            return f;
        }
    }
    复制代码

     六、导出多个word的压缩包,思路详情和代码见连接:

    https://www.cnblogs.com/lsy-blogs/p/10173904.html

  • 相关阅读:
    android 上面的视频播放
    android 中的 xml 解析方法
    database is locked
    Ubuntu 下获取 debug.keystore 的MD5
    Ubuntu 真机 调试
    PreferenceActivity 的用法总结
    WebView 相关知识点
    android 知识点
    Thread 中的 中断
    Java 追加数据到文件
  • 原文地址:https://www.cnblogs.com/Bkxk/p/12181575.html
Copyright © 2020-2023  润新知