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中的使用(动态生成多条数据及多张图片)的主要内容,如果未能解决你的问题,请参考以下文章