使用Freemarker创建word文档
最近做一个项目,本来是直接在网页上查看文本信息,然后给客户直接打印的,但是发现也许是浏览器还是打印机的原因,总之,有个客户打印出来的格式始终与其他的不同,没办法,最后想到了直接将数据库中的信息生成一个Word文档,供客户下载,这样因为事先模板已经设置后,所以客户可以直接打印,也可以根据自己的爱好,调整格式,废话不多说,讲讲项目。
首先,这个用到了freemarker,先把用到的可能用到的jar包给大家看看:
opencv-2410.jar
freemarker.jar
sun.misc.BASE64Decoder.jar
需要这三个jar包的朋友,可以直接@我;
开始项目步骤:
1、在新建一个Word文档,将你想好的模板格式设计好
审美观不好,大家多多见谅,这里红色标记的部分是插入的图片,这里就没将图片插进去了。 相信细心的朋友也看见了里面很多我是用${*}来代替的,这个很关键,每一个都代表你动态往里面填充的数据,在后台填充的时候也是根据里面的代码来执行的。
2、模板生成好了之后,选择另存为,将Word文档保存为后缀名为xml的文本信息,
选择保存。
3、保存之后,用记事本打开xml文件,你会发现里面的内容成了这样
是不是完全看不懂,没关系,仔细看下,你会发现里面很多你编辑的内容都在,比如{*}这种,也可能觉得格式不对,小伙伴别着急,回头你放在eclipse里面,格式化一下,就好看多了;当然,这里的注意,由于收入法以及个人打字习惯的原因,在Word里面编辑的时候会出现${*}分开的时候,这时,你打开xml就发现变成了${* ,隔了好大一部分代码才有一个},这种是执行不了的,所以个人建议是事先在txt文档中写好,复制过去;还有,你插入的图片这里会识别不了,成为乱码,别着急,搜索<pkg:binaryData>,找到首位部分,替换一下,我替换之后成了这样<pkg:binaryData>${papersImg}</pkg:binaryData>,最后选择保存;
4、下面开始讲解代码编写,导包就不多说了,这里把项目用到的代码给大家粘贴下面,我个人比较懒,代码我也加了注释,方便测试人看,所以也就不给大家细细讲解了,有不懂的可以私下问我;
package com.inquiry.util; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; import com.inquiry.vo.WordSetVo; import Decoder.BASE64Encoder; import freemarker.template.Configuration; import freemarker.template.Template; public class CreateWord { /** * 将对应的图片放入Word文档中 * @param imgFile * @return */ private static String getImageStr(String imgFile) { InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } /** * * @param vo word数据回填 * @param status 审核进度 * @param saveAddress //文件保存地址 */ public static void setData(WordSetVo vo ,int status, String saveAddress,String path) { Map<String, Object> map = new HashMap<String, Object>(); // 编号 map.put("formid", vo.getFormNumber()); // 证件照 map.put("papersImg", getImageStr(downloadPicture(vo.getPapersImg(),path))); // 现场照 map.put("spotImg", getImageStr(downloadPicture(vo.getSpotImg(),path))); // 姓名 map.put("name", vo.getName()); // 曾用名 if (vo.getFormName() != null) { map.put("formName", vo.getFormName()); } else { map.put("formName", ""); } // 性别 map.put("gender", vo.getGender()); // 民族 map.put("ethnicGroups", vo.getEthnicGroups()); // 年龄 map.put("age", vo.getAge()); // 学历 map.put("eduBg",vo.getEduBg()); // 婚姻状况 map.put("maritalStatus", vo.getMaritalStatus()); // 原户籍地 map.put("originalResidence", vo.getOriginalResidence()); // 现户籍地 map.put("nowResidence", vo.getNowResidence()); // 身份证 map.put("idcard", vo.getIdcard()); // 申请证件类别 map.put("papersType", vo.getPapersType()); // 联系电话 map.put("phone", vo.getPhone()); // 紧急联系人 if (vo.getLinkMan() != null) { map.put("linkMan", vo.getLinkMan()); } else { map.put("linkMan", " "); } // 联系人电话 if (vo.getLinkPhone() != null) { map.put("linkPhone", vo.getLinkPhone()); } else { map.put("linkPhone", " "); } // 现住址 if (vo.getAddress()!= null) { map.put("address", vo.getAddress()); } else { map.put("address", " "); } // 工作单位 if (vo.getWorkUnit()!= null) { map.put("workUnit", vo.getWorkUnit()); } else { map.put("workUnit", " "); } // 任职情况 if (vo.getPosition() != null) { map.put("position", vo.getPosition()); } else { map.put("position", " "); } // 迁入时间 if (vo.getImmigrationTime() != null) { map.put("immigrationTime", vo.getImmigrationTime()); } else { map.put("immigrationTime", " "); } // 迁入原因 if (vo.getImmigrationCause() != null) { map.put("immigrationCause", vo.getImmigrationCause()); } else { map.put("immigrationCause", " "); } // 出境事由 if (vo.getExitCause() != null) { map.put("exitCause",vo.getExitCause()); } else { map.put("exitCause", " "); } if(status==1){ //县国保大队 setXgb(map,vo,path); } else if(status ==2){ setXgb(map,vo,path); //市国保支队 setXfk(map,vo,path); }else if(status == 3){ setXgb(map,vo,path); setXfk(map,vo,path); //市反恐支队 setSgb(map,vo,path); } try { // 生成文件的路径及文件名。 File outFile = new File(saveAddress); Writer out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile), "UTF-8")); // 使用FileTemplateLoader //选择调用的模板 String tempname = null ; if(status==1){ tempname = "temp1.xml"; }else if(status==2){ tempname = "temp2.xml"; }else if(status==3){ tempname = "temp3.xml"; }else if(status==0){ tempname = "temp0.xml"; } Configuration configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassForTemplateLoading( CreateWord.class,"/com/inquiry/xml"); Template t = configuration.getTemplate(tempname, "UTF-8"); t.process(map, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 回填县国保大队 * @param map * @param vo */ private static void setXgb(Map<String, Object> map , WordSetVo vo,String path){ map.put("xgb", vo.getXgb()); map.put("xgdc", vo.getXgdc()); map.put("xgsh", vo.getXgsh()); map.put("xgdate", vo.getXgdate()); map.put("xggz", getImageStr(downloadPicture(vo.getXggz(),path))); map.put("xgremark", vo.getXgremark()); } /** * 回填市国保支队 * @param map * @param vo */ private static void setXfk(Map<String, Object> map , WordSetVo vo,String path){ map.put("xfb", vo.getXfb()); map.put("xfdc", vo.getXfdc()); map.put("xfsh", vo.getXfsh()); map.put("xfdate", vo.getXfdate()); map.put("xfgz", getImageStr(downloadPicture(vo.getXfgz(),path))); map.put("xfremark", vo.getXfremark()); } /** * 回填市反恐支队 * @param map * @param vo */ private static void setSgb(Map<String, Object> map , WordSetVo vo,String path){ map.put("sgb", vo.getSgb()); map.put("sgdc", vo.getSgdc()); map.put("sgsh", vo.getSgsh()); map.put("sgdate", vo.getSgdate()); map.put("sggz", getImageStr(downloadPicture(vo.getSggz(),path))); map.put("sgremark", vo.getSgremark()); } /** * 传入要下载的图片的url列表,将url所对应的图片下载到本地 * @param urlList */ public static String downloadPicture(String urlString,String path) { URL url = null; String imgPath = null; try { url = new URL(path+urlString); // 打开URL连接 URLConnection con = url.openConnection(); // 得到URL的输入流 InputStream input = con.getInputStream(); // 设置数据缓冲 byte[] bs = new byte[1024 * 2]; // 读取到的数据长度 int len; // 输出的文件流保存图片至本地 imgPath = createFile()+"/"+urlString.split("/")[urlString.split("/").length-1]; OutputStream os = new FileOutputStream(imgPath); while ((len = input.read(bs)) != -1) { os.write(bs, 0, len); } os.close(); input.close(); return imgPath; } catch (Exception e) { e.printStackTrace(); } return imgPath; } /** * 在本地创建文件保存位置 * @return */ public static String createFile(){ //定义下载文件保存位置 String address = "C://inquiry"; File file = new File(address); if (!file.exists()) { file.mkdir(); } return address; } }
最后就只剩下传数据测试咯,注意一下,图片地址必须给正确,不然会报错哦。