Java Web用Freemarker生成带图片的Word文档

时间:2023-03-08 21:55:24

步骤一:模板制作

用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();
} } }