Java Web用Freemarker生成带图片的Word文档
步骤一:模板制作
用world2003做一个导出模板,如果有图片则加入一张图片占位,将world另存为xml,将xml中需要导出的内容用Freemarker标签表示,最后另存为.ftl结尾的模板:
步骤二:后台代码
1、获取导出的数据:
@RequestMapping(value = "/exportDoc") public void exportDoc(String resumeId,HttpServletResponse response,HttpServletRequest request) throws Exception{ User u= SessionUtils.getUser(request.getSession()); Map<String, Object> dataMap = new HashMap<String, Object>();// 要填入模本的数据文件 ResumeBasicInformationQueryParam resumeParam=new ResumeBasicInformationQueryParam(); resumeParam.setUuid(resumeId); WorkExperienceParam workExperienceParam=new WorkExperienceParam(); workExperienceParam.setResumeId(resumeId); EducationBackgroundParam educationParam=new EducationBackgroundParam(); educationParam.setResumeId(resumeId); SkillEvaluationParam skillParam=new SkillEvaluationParam(); skillParam.setResumeId(resumeId); ProjectExperienceParam projectParam=new ProjectExperienceParam(); projectParam.setResumeId(resumeId); LanguageabilityParam languageParam=new LanguageabilityParam(); languageParam.setResumeId(resumeId); TrainingExperienceParam trainParam=new TrainingExperienceParam(); trainParam.setResumeId(resumeId); //验证导出用户是否可以看到简历姓名 ResumeHandleParam handleParam=new ResumeHandleParam(); handleParam.setResumeIds("'"+resumeParam.getUuid()+"'"); handleParam.setCorpId(SessionUtils.getCorpId(request.getSession())); int count = 0; count = resumeHandleService.checkEnshrine(handleParam); ResumeBasicInformationResp rbIfonResp = new ResumeBasicInformationResp(); //查询当前登录用户的简历基本信息 List<ResumeBasicInformationResp> resumeBasicList = resumeBasicInformationService.getResumeBasic(resumeParam); if(resumeBasicList.size()>0){ rbIfonResp = resumeBasicList.get(0); //性别 if("1".equals(rbIfonResp.getGender())){ rbIfonResp.setGender("男"); }else{ rbIfonResp.setGender("女"); } //婚姻状况 if("1".equals(rbIfonResp.getMaritalStatus())){ rbIfonResp.setGender("已婚"); }else if("2".equals(rbIfonResp.getMaritalStatus())){ rbIfonResp.setGender("未婚"); }else{ rbIfonResp.setGender("保密"); } //姓名、邮箱、电话是否可见 if(count==0){ //没有将该简历放入简历库、没有投递该企业,若简历设置了不可见,则企业看不到 if("1".equals(rbIfonResp.getNamePrivacy()) && rbIfonResp.getName()!=""){ String name = rbIfonResp.getName().substring(0, 1)+" *"; rbIfonResp.setName(name); } if("1".equals(rbIfonResp.getEmailPrivacy()) && rbIfonResp.getEmail()!=""){ int pos = rbIfonResp.getEmail().indexOf("@"); String result = rbIfonResp.getEmail().substring(pos, rbIfonResp.getEmail().length()); rbIfonResp.setEmail("****"+result); } if("1".equals(rbIfonResp.getTelPrivacy()) && rbIfonResp.getTelephone()!=""){ String telephone = rbIfonResp.getTelephone().substring(0, 3) + "****" + rbIfonResp.getTelephone().substring(7, 11) ; rbIfonResp.setTelephone(telephone); } } } dataMap.put("rbIfonResp", rbIfonResp); //dataMap.put("resumeList", resumeBasicList); //工作经历信息 List<WorkExperienceResp> workExperienceList=workExperienceService.selectWorkExperience(workExperienceParam); dataMap.put("workExperienceList", workExperienceList); //教育经历信息 List<EducationBackgroundResp> educationList=educationService.selectEducation(educationParam); dataMap.put("educationList", educationList); //技能评价信息 List<SkillEvaluationResp> skillList=skillService.selectSkillEvaluation(skillParam); dataMap.put("skillList", skillList); //项目经验信息 List<ProjectExperienceResp> projectList=projectService.selectProject(projectParam); dataMap.put("projectList", projectList); //语言能力信息 List<LanguageabilityResp> languageList=languageService.selectLanguage(languageParam); dataMap.put("languageList", languageList); //培训经历 List<TrainingExperienceResp> trainList=trainingService.selectTrainingExperience(trainParam); dataMap.put("trainList", trainList); //作品展示 WorkAttachmentParam waParam = new WorkAttachmentParam(); waParam.setResumeId(resumeId); waParam.setWorkType("1"); // 类型:1-作品;2-附件 List<WorkAttachmentResp> workAttachemntList = workAttachmentService.selectWorkAttachment(waParam); //作品路径 String resourceUrl = ""; //项目路径 String url = FileManagerUtils.getFilePath(null) + "/"; if(workAttachemntList!=null && workAttachemntList.size()>0){ for(int i=0;i<workAttachemntList.size();i++){ resourceUrl = url + workAttachemntList.get(i).getResourceUrl(); //先将网络图片下载到本地,再将本地图片转换成BASE64字符串 workAttachemntList.get(i).setResourceUrl(getImageString(resourceUrl)); workAttachemntList.get(i).setIndex(i); } } dataMap.put("workAttachemntList", workAttachemntList); ExportDoc exportDoc = new ExportDoc(); exportDoc.create(dataMap,response); }
2、将本地、网络图片转换成BASE64字符串
/** * * @Title: getImageString * @Description: 将本地、网络图片转换成BASE64字符串 * @param @param filename * @param @return * @param @throws IOException * @return String * @throws */ public static String getImageString(String imageUrl) throws IOException { //InputStream in = null; InputStream dis = null; byte[] data = null; try { //方法一、将网络图片导入wolrd URL url = new URL(imageUrl); //打开网络输入流 URLConnection conn = url.openConnection(); //设置超时间为3秒 //conn.setConnectTimeout(3*1000); //防止屏蔽程序抓取而返回403错误 //conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到输入流 InputStream inputStream = conn.getInputStream(); //获取自己数组 data = readInputStream(inputStream); /* //方法二、将本地图片导入wolrd,打开本地输入流 in = new FileInputStream(imageUrl); data = new byte[in.available()]; in.read(data); in.close(); */ } catch (IOException e) { throw e; } finally { if (dis != null) dis.close(); } BASE64Encoder encoder = new BASE64Encoder(); return data != null ? encoder.encode(data) : ""; }
/** * * @Title: readInputStream * @Description: 将网络图片流转换成数组 * @param @param inputStream * @param @return * @param @throws IOException * @return byte[] * @throws */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } /** * @Title: downloadImg * @Description: 网络图片下載到本地 * @param @param imgUrl:网络图片,http开头 * @param @return 返回下载到本地的图片路径 * @param @throws Exception * @return String * @throws */ public String downloadImg(String imgUrl) throws Exception{ // 构造URL URL url = new URL(imgUrl); // 打开连接 URLConnection con = url.openConnection(); //设置请求超时为5s con.setConnectTimeout(5*1000); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; //创建下载路径 String savePath = "D://download//"; String filename = UUIDUtil.getUUID()+".jpg"; String returnUrl = savePath+filename; File sf = new File(savePath); if(!sf.exists()){ sf.mkdirs(); } // 输出的文件流 OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.flush(); os.close(); is.close(); return returnUrl; }
3、导出模板
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Map; import javax.servlet.http.HttpServletResponse; import freemarker.template.Configuration; import freemarker.template.Template; /** * * @ClassName:ExportDoc * @Description: 导出简历模板 * @author: * @date:2015-6-25 下午3:52:12 * @version 1.0 */ public class ExportDoc { private Configuration configuration = null; public ExportDoc() { configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); } /** * * @Title: create * @Description: 注意dataMap里存放的数据Key值要与模板中的参数相对应 * @param @param dataMap * @param @param response * @param @throws Exception * @return void * @throws */ public void create(Map<String, Object> dataMap, HttpServletResponse response) throws Exception { // 模板放在com.canyou.template包下面,通过classpath装载 configuration.setClassForTemplateLoading(this.getClass(), "/com/***/ftl"); //自己在项目中放入模板位置 Template template = configuration.getTemplate("resume.ftl");// 设置要装载的模板 String fileName = String.valueOf(Math.random()*10000); File outFile = new File(fileName.replace(".", "")+".doc"); if (!outFile.exists()) { outFile.createNewFile(); } Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); template.process(dataMap, out); out.close(); //导出时有界面,可选择下载路径 response.addHeader("Content-Disposition", "attachment;filename=" + new String(outFile.getName().getBytes("utf-8"), "utf-8")); response.setContentType("application/msword"); OutputStream out1 = null; InputStream in = null; try { in = new FileInputStream(outFile); out1 = response.getOutputStream(); BufferedInputStream bis = new BufferedInputStream(in); BufferedOutputStream bos = new BufferedOutputStream(out1); byte[] buff = new byte[20480]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bis.close(); bos.flush(); bos.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (out1 != null) out1.close(); if (in != null) in.close(); } } }