zoukankan      html  css  js  c++  java
  • 使用FreeMarker导出word文档(支持导出图片)

    一、添加maven依赖,导入FreeMarker所需要的jar包

    1 <dependency>
    2      <groupId>org.freemarker</groupId>
    3      <artifactId>freemarker</artifactId>
    4      <version>2.3.20</version>
    5 </dependency>

    二、定义word模板文件

    三、修改模板xml文件

    把刚刚制作的word文件另存为xml文件

    修改这个xml文件,开发工具我用的idea,我是把这个xml文件放在项目中,Ctrl+Alt+L进行格式化,这样文件内容看起来结构比较清晰,方便修改,你也可以使用其他xml编辑器等等

    把文档内容中的动态数据,换成freemarker的标识。其实就是Map<String, Object>中key,如把段然涛换成${name};

    教育经历是需要循环遍历的,在这里可以循环遍历list,list中存储的都是Map数据,然后再一一取出

    折叠起来看就是这样,一定不要忘记了结束的list标签

    接下来就是图片了,在加入了图片占位的地方,会看到一片base64编码后的代码,把base64删除替换成${image},图片不确定有多少张,也是需要循环遍历的

    这些全部弄好之后,模板就制作完了,修改文件为.ftl即可,然后把模板放入到项目中

    四、代码编写

    接下来就是代码部分了,编写FreeMarkerUtil工具类,并测试

      1 package com.cccuu.project.utils;
      2 
      3 import freemarker.template.Configuration;
      4 import freemarker.template.DefaultObjectWrapper;
      5 import freemarker.template.Template;
      6 import freemarker.template.TemplateExceptionHandler;
      7 import org.apache.log4j.Logger;
      8 import sun.misc.BASE64Encoder;
      9 
     10 import java.io.*;
     11 import java.util.*;
     12 
     13 /*******************************************
     14  *
     15  * @Package com.cccuu.project.utils
     16  * @Author duan
     17  * @Date 2018/7/27 11:51
     18  * @Version V1.0
     19  *******************************************/
     20 public class FreeMarkerUtil {
     21 
     22     private static Logger log = Logger.getLogger(FreeMarkerUtil.class);
     23     private static final String ENCODING = "UTF-8";
     24     private static Configuration cfg = new Configuration();
     25 
     26     //初始化cfg
     27     static {
     28         //设置模板所在文件夹
     29         cfg.setClassForTemplateLoading(FreeMarkerUtil.class, "/templates/word");
     30         // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
     31         cfg.setEncoding(Locale.getDefault(), ENCODING);
     32         // 设置对象的包装器
     33         cfg.setObjectWrapper(new DefaultObjectWrapper());
     34         // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
     35         cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
     36 
     37     }
     38 
     39     //获取模板对象
     40     public static Template getTemplate(String templateFileName) throws IOException {
     41         return cfg.getTemplate(templateFileName, ENCODING);
     42     }
     43 
     44     /**
     45      * 据数据及模板生成文件
     46      * @param data             Map的数据结果集
     47      * @param templateFileName ftl模版文件名
     48      * @param outFilePath      生成文件名称(可带路径)
     49      */
     50     public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
     51         Writer out = null;
     52         File outFile = new File(outFilePath);
     53         try {
     54             // 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
     55             Template template = getTemplate(templateFileName);
     56             if (!outFile.getParentFile().exists()) {
     57                 outFile.getParentFile().mkdirs();
     58             }
     59             out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
     60             // 处理模版
     61             template.process(data, out);
     62             out.flush();
     63             log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
     64         } catch (Exception e) {
     65             log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
     66             e.printStackTrace();
     67         } finally {
     68             try {
     69                 if (out != null) {
     70                     out.close();
     71                 }
     72             } catch (IOException e) {
     73                 log.error("关闭Write对象出错", e);
     74                 e.printStackTrace();
     75             }
     76         }
     77         return outFile;
     78     }
     79 
     80     //获得图片的base64码
     81     public static String getImageBase(String src) throws Exception {
     82         if (src == null || src == "") {
     83             return "";
     84         }
     85         File file = new File(src);
     86         if (!file.exists()) {
     87             return "";
     88         }
     89         InputStream in = null;
     90         byte[] data = null;
     91         try {
     92             in = new FileInputStream(file);
     93             data = new byte[in.available()];
     94             in.read(data);
     95             in.close();
     96         } catch (IOException e) {
     97             e.printStackTrace();
     98         }
     99         BASE64Encoder encoder = new BASE64Encoder();
    100         return encoder.encode(data);
    101     }
    102 
    103     public static void main(String[] args) {
    104         try {
    105             Map<String, Object> data = new HashMap<String, Object>();
    106             data.put("name", "段然涛");
    107             data.put("sex", "男");
    108             data.put("birthday", "1994-03-14");
    109             data.put("phone", "17737138812");
    110             data.put("address", "河南省许昌市");
    111             data.put("school", "江西科技师范大学");
    112             List<Map<String, String>> educations = new ArrayList<Map<String, String>>();
    113             Map<String, String> paramsMap = new HashMap<String, String>();
    114             paramsMap.put("school", "禹州一高");
    115             paramsMap.put("startDate", "2008-09");
    116             paramsMap.put("endDate", "2012-06");
    117             paramsMap.put("person", "李磊");
    118             Map<String, String> paramsMap2 = new HashMap<String, String>();
    119             paramsMap2.put("school", "江西科技师范大学");
    120             paramsMap2.put("startDate", "2012-09");
    121             paramsMap2.put("endDate", "2016-07");
    122             paramsMap2.put("person", "李杰");
    123             educations.add(paramsMap);
    124             educations.add(paramsMap2);
    125             data.put("educations", educations);
    126             List<String> images = new ArrayList<String>();
    127             images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg.jpg"));
    128             images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg11.jpg"));
    129             data.put("images", images);
    130             crateFile(data, "文档1.ftl", "C:/Users/Administrator/Desktop/文档/简历.doc");
    131         } catch (Exception e) {
    132             e.printStackTrace();
    133         }
    134     }
    138 }

     五、最后效果

  • 相关阅读:
    CSS3相关编码规范
    WEB开发中常见的漏洞
    Python常用端口扫描
    33、Django实战第33天:我的消息
    32、Django实战第32天:我的收藏
    31、Django实战第31天:我的课程
    30、Django实战第30天:修改邮箱和用户信息
    29、Django实战第29天:修改密码和头像
    28、Django实战第28天:个人信息展示
    27、Django实战第27天:全局搜索功能开发
  • 原文地址:https://www.cnblogs.com/duanrantao/p/9377818.html
Copyright © 2011-2022 走看看