Freemarker在Java中的使用(动态生成多条数据及多张图片)

Posted mywyr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Freemarker在Java中的使用(动态生成多条数据及多张图片)相关的知识,希望对你有一定的参考价值。

这两天项目中需要用到导出报告,在网上选择了一会最终还是选择了Freemarker,毕竟免费的0.0

因为也只是简单的用到,有什么不完善的请各位读者不吝赐教啊

刚开始   我也不知道如何使用  在网上招了很久   也没找到一个完整的能使用的(有的挺完整,但还是少点东西)

下面是我自己终结的   分为 word模板的简历   和java代码的书写两个步骤

word模板的建立  网上有很多例子  另存为xml  再更改后缀为ftl格式  利用notepad的xml tool格式化这个文件

  这里我还是说下自己的不同  

  模板中部分的部分(包含部分单一字段以及表格需要遍历的字段)  可以在word里不写${占位符}  写了的话在生成xml的时候${占位符}可能会分离   不过报错会报错到具体位置很容易找到  不用担心

  至于我下图中时间等直接在java中书写就好(下面上Java代码会说明)

  至于表格中需要遍历list的需要写<#list list as list></#list>包在ftl文件中的<w :tr.....这个代表的好像是table中的tr  遍历一行的意思   (list说明  第一个list代表的是集合  第二个是你在java中的list名称  第三个就是别名了

  在ftl文件中我的下图个例就需要写${list.reName} 这个东西了    这样我们的动态遍历表格的ftl文件就写好了  Java代码看下图   其他的不说  说下遍历表格和遍历图片

  表格-----------------看蓝色部分

  图片-----------------看红色部分       (图片需要将图片转化为base64  见黄色部分----你可能没有BASE64Encoder 这个类---末尾)

  至于这些java代码   网上很多的例子也有这样的   但是他们对应的ftl格式文件就不对了    下面说下图片的    因为表格的额已经说了   注意下面三个代码段  注意4个颜色区域  两两对应    这是要特别注意的地方

  为什么有两段写的是image_index+10   因为是为了避免与其他id重复

  

<pkg:part pkg:name="/word/_rels/document.xml.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="256">
        <pkg:xmlData>
            <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
                <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>
                <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/>
                <#list images as image>
                <Relationship Id="rId${image_index+10}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image${image_index+1}.jpeg"/>
                </#list>
                <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
                <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/>
                <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes" Target="endnotes.xml"/>
                <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes" Target="footnotes.xml"/>
                <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/>
                <Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
            </Relationships>
        </pkg:xmlData>
    </pkg:part>
<#list images as image>
    <pkg:part pkg:name="/word/media/image${image_index+1}.jpeg" pkg:contentType="image/jpeg" pkg:compression="store">
        <pkg:binaryData>${image}</pkg:binaryData>
    </pkg:part>
    </#list>
<#list images as image>
                                <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:400.5pt;height:246pt">
                                    <v:imagedata r:id="rId${image_index+10}" o:title="shuibeng"/>
                                </v:shape>
                                </#list>

 

  

技术分享图片

  1 package com.uspring.chuantian.common;
  2 
  3 import java.io.BufferedWriter;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.io.InputStream;
 10 import java.io.OutputStreamWriter;
 11 import java.io.Writer;
 12 import java.text.SimpleDateFormat;
 13 import java.util.ArrayList;
 14 import java.util.Date;
 15 import java.util.HashMap;
 16 import java.util.List;
 17 import java.util.Map;
 18 
 19 import com.uspring.chuantian.entity.po.QltyDetailsResultDO;
 20 import com.uspring.chuantian.entity.po.QltyDeviceCheckDO;
 21 
 22 import freemarker.template.Configuration;
 23 import freemarker.template.Template;
 24 import freemarker.template.TemplateException;
 25 import sun.misc.BASE64Encoder;
 26 
 27 public class ExportWord {
 28 
 29     private Configuration configuration = null;
 30 
 31     public ExportWord() {
 32         configuration = new Configuration();
 33         configuration.setDefaultEncoding("UTF-8");
 34     }
 35 
 36     // public static void main(String[] args) {
 37     // ExportWord test = new ExportWord();
 38     // test.createWord();
 39     // }
 40     //
 41     public void createWord(Map<String, Object> tableMap) {
 42         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
 43         Map<String, Object> dataMap = new HashMap<String, Object>();
 44         getData(dataMap, tableMap);
 45         configuration.setClassForTemplateLoading(this.getClass(), "/docTest"); // FTL文件所存在的位置
 46         Template t = null;
 47         try {
 48             t = configuration.getTemplate("chuantian01.ftl"); // 文件名
 49         } catch (IOException e) {
 50             e.printStackTrace();
 51         }
 52         File outFile = new File("D:/质检记录-" + sdf.format(new Date()) + ".doc"); // 导出文档的存放位置
 53         Writer out = null;
 54         try {
 55             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
 56         } catch (FileNotFoundException e1) {
 57             e1.printStackTrace();
 58         }
 59         try {
 60             t.process(dataMap, out);
 61         } catch (TemplateException e) {
 62             e.printStackTrace();
 63         } catch (IOException e) {
 64             e.printStackTrace();
 65         }
 66     }
 67 
 68     //获得图片的base64码
 69     public static String getImageBase(String src) throws Exception {
 70         if (src == null || src == "") {
 71             return "";
 72         }
 73         File file = new File(src);
 74         if (!file.exists()) {
 75             return "";
 76         }
 77         InputStream in = null;
 78         byte[] data = null;
 79         try {
 80             in = new FileInputStream(file);
 81             data = new byte[in.available()];
 82             in.read(data);
 83             in.close();
 84         } catch (IOException e) {
 85             e.printStackTrace();
 86         }
 87         BASE64Encoder encoder = new BASE64Encoder();
 88         return encoder.encode(data);
 89     }
 90 
 91     private void getData(Map<String, Object> dataMap, Map<String, Object> tableMap) {
 92         // 基础信息填写
 93         dataMap.put("dcCareNumber", ((QltyDeviceCheckDO) tableMap.get("basisValue")).getDcMakeNumber());
 94         dataMap.put("customerCode", ((QltyDeviceCheckDO) tableMap.get("basisValue")).getCustomerCode());
 95         dataMap.put("machineName", ((QltyDeviceCheckDO) tableMap.get("basisValue")).getDcMachineType());
 96         dataMap.put("dcMachineType", ((QltyDeviceCheckDO) tableMap.get("basisValue")).getDcMachineType());
 97         dataMap.put("dcMakeNumber", ((QltyDeviceCheckDO) tableMap.get("basisValue")).getDcMakeNumber());
 98         dataMap.put("chengren", "郑东林");
 99         dataMap.put("queren", "张智萍");
100         dataMap.put("zuocheng", "朱峰");
101         dataMap.put("newTime", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
102         dataMap.put("checkPlace", "川田工厂调试区");
103         dataMap.put("checkMachine", "智能测试平台(压力传感器、流量传感器、多功能万用表)");
104 
105         List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
106         List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
107         List<Map<String, Object>> list3 = new ArrayList<Map<String, Object>>();
108         List<Map<String, Object>> list4 = new ArrayList<Map<String, Object>>();
109         for (int i = 0; i < ((List) tableMap.get("table1")).size(); i++) {
110             Map<String, Object> map1 = new HashMap<String, Object>();
111             map1.put("reName1", ((QltyDetailsResultDO) (((List) tableMap.get("table1")).get(i))).getReName());
112             map1.put("ctdType", ((QltyDetailsResultDO) (((List) tableMap.get("table1")).get(i))).getCtdType());
113             map1.put("ctdNumber", ((QltyDetailsResultDO) (((List) tableMap.get("table1")).get(i))).getCtdNumber());
114             map1.put("ctdremark", ((QltyDetailsResultDO) (((List) tableMap.get("table1")).get(i))).getCtdRemark());
115             list1.add(map1);
116         }
117         for (int j = 0; j < ((List) tableMap.get("table2")).size(); j++) {
118             Map<String, Object> map2 = new HashMap<String, Object>();
119             map2.put("reName2", ((QltyDetailsResultDO) (((List) tableMap.get("table2")).get(j))).getReName());
120             map2.put("ctdCmethod", ((QltyDetailsResultDO) (((List) tableMap.get("table2")).get(j))).getCtdCmethod());
121             map2.put("ctdBasic2", ((QltyDetailsResultDO) (((List) tableMap.get("table2")).get(j))).getCtdBasic());
122             map2.put("ctdResult2", ((QltyDetailsResultDO) (((List) tableMap.get("table2")).get(j))).getReResult()==false?"合格":"不合格");
123             System.out.println("测试"+map2.get("ctdResult2"));
124             list2.add(map2);
125         }
126         for (int k = 0; k < ((List) tableMap.get("table3")).size(); k++) {
127             Map<String, Object> map3 = new HashMap<String, Object>();
128             map3.put("reName3", ((QltyDetailsResultDO) (((List) tableMap.get("table3")).get(k))).getReName());
129             map3.put("ctdDetail3", ((QltyDetailsResultDO) (((List) tableMap.get("table3")).get(k))).getCtdDetail());
130             map3.put("ctdBasic3", ((QltyDetailsResultDO) (((List) tableMap.get("table3")).get(k))).getCtdBasic());
131             map3.put("ctdResult3", ((QltyDetailsResultDO) (((List) tableMap.get("table3")).get(k))).getReResult()==true?"合格":"不合格");
132             System.out.println("测试2"+map3.get("ctdResult3"));
133             list3.add(map3);
134         }
135         for (int l = 0; l < ((List) tableMap.get("table4")).size(); l++) {
136             Map<String, Object> map4 = new HashMap<String, Object>();
137             map4.put("reName4", ((QltyDetailsResultDO) (((List) tableMap.get("table4")).get(l))).getReName());
138             map4.put("ctdBasicValue", ((QltyDetailsResultDO) (((List) tableMap.get("table4")).get(l))).getCtdType());
139             System.out.println("测试"+((QltyDetailsResultDO) (((List) tableMap.get("table4")).get(l))).getCtdType());
140             map4.put("ctdReal", ((QltyDetailsResultDO) (((List) tableMap.get("table4")).get(l))).getCtdReal());
141             map4.put("ctdResult4", ((QltyDetailsResultDO) (((List) tableMap.get("table4")).get(l))).getReResult()==true?"合格":"不合格");
142             list4.add(map4);
143         }
144         //处理图片部分
145          List<String> images = new ArrayList<String>();
146          try {
147              System.out.println(getImageBase("C:/Users/Administrator/Desktop/aaa.jpg"));
148             images.add(getImageBase("C:/Users/Administrator/Desktop/aaa.jpg"));
149             images.add(getImageBase("C:/Users/Administrator/Desktop/bb.jpg"));
150         } catch (Exception e) {
151             // TODO Auto-generated catch block
152             e.printStackTrace();
153         }
154          
155         dataMap.put("images", images);
156         dataMap.put("temperature", "18℃");
157         dataMap.put("humidity", "15%");
158         dataMap.put("waterPre", "10Mpa");
159         dataMap.put("waterPressure", "10Mpa");
160 
161         dataMap.put("list1", list1);
162         dataMap.put("list2", list2);
163         dataMap.put("list3", list3);
164         dataMap.put("list4", list4);
165     }
166 }

 

注意点:

1.没有BASE64Encoder怎么办?   --技术分享图片  

   右击项目出现这个   会java的都知道这个    remove这个jre   然后再add Library  里选择jre用workspace default的那个   出来就有这个类了

2.其他的有不明白的加Q--365929416

 

以上是关于Freemarker在Java中的使用(动态生成多条数据及多张图片)的主要内容,如果未能解决你的问题,请参考以下文章

使用docxtpl生成多列表

Freemarker在Java中的使用(动态生成多条数据及多张图片)

如何在 nodejs 中侦听和生成多个子进程

用Python或者Java如何生成多位数字不重复的数

使用循环生成多个子图

如何使用 numpy 生成多类测试数据集?