100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 简单介绍如何应用【Poi-tl】将【个人简历】导出为【docx】格式的【word】文档

简单介绍如何应用【Poi-tl】将【个人简历】导出为【docx】格式的【word】文档

时间:2019-04-12 01:52:07

相关推荐

简单介绍如何应用【Poi-tl】将【个人简历】导出为【docx】格式的【word】文档

前言:

excel导入导出的使用场景相对比较多,大家都很熟悉了,怎么导入,怎么导出,可以根据自己的喜好选择一款适合的框架即可,现在的框架封装的都很完美。比如:阿里的easyexcel,它不会像以前直接用poi那么繁杂,以前你需要做的事情,easyexcel已经给你做好了,你只需要调用接口传递数据对象就可以了,就这么方便快捷。框架的使用我不做过多的讲解,大家可以自行搜索。既然excel能有这么便利的架构,那word会不会有呢。凭着这样的猜想我去找了找,哎,发现确实有哦。比如:easypoi、easyword、poi-tl都可以做到,不过poi-tl的文档写的不错,容易入手,接下来我通过一个简单的案例来讲解一下使用

一、引入Poi-tl的依赖包

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version></dependency>

二、制作模板【个人简历】

占位符说明
字段的显示使用{{var}}占位,var变量名可自定义。如果你的数据对象map结构,那么var就表示mapkey,如果你的数据对象实体对象,那么var就表示实体对象的属性名图片的显示需要使用{{@var}}来占位,否则无法被解析到表格的展示和普通数据没有太大的区别也使用{{var}}占位,但不一样的是{{var}}放在表头,因为表头是不需要循环的,需要循环的部分对每一列的单元格进行占位,使用[var]
模板结构如下图所示[个人简历模板]

三、写代码

/*** 返回文件输入流** @param fileName* @param filePath* @param suffix* @return*/private InputStream inputStream(String fileName, String filePath, String suffix) {return Objects.requireNonNull(this.getClass().getClassLoader().getResourceAsStream(String.format("%s/%s.%s", filePath, fileName, suffix)));}/*** 导出个人简历【word】*/public void resumeOwn(HttpServletResponse response) {String fileName = "个人简历";try {setHttpServletResponse(fileName, response);LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();Configure configure = Configure.builder().bind("25", policy).bind("26", policy).bind("30", policy).build();pile(inputStream(String.format("%s【模板】", fileName), "templates", "docx"), configure).render(data()).writeAndClose(response.getOutputStream());} catch (Exception e) {log.error("导出[{}.docx]异常:{}", fileName, e);}}/*** 数据组装** @return*/private Map<String, Object> data() {return dataMap("古*薇", //姓名//性别"女",//出生日期-年"1997",//出生日期-月"5",//出生日期-日"1",//岗位"财务经理",//最高学历"本科",//民族"汉族",//身份证号"41****908****",//婚姻状况"未婚",//血型"O型",//籍贯-省"xxx省",//籍贯-市(县)"xxx市xxx区",//籍贯-乡(镇)"xxx街道xxx号",//身高(cm)"167",//户口所在地-省"xxx省",//户口所在地-市(县)"xxx市xxx区",//户口所在地-乡(镇)"xxx街道xxx号",//体重(kg)"62",//固定电话"0**-3****92",//QQ号码"178****",//本人手机"189****390",//Email"178****@",//现住详细地址"xxx省xxx市xxx区xxx街道xxx号xxx小区xxx栋xxx单元xxx号",// 证件照Pictures.ofStream(inputStream("证件照", "images", "png"), PictureType.PNG).size(115, 135).create(),// 教育经历eduTables(25),// 家庭成员familys(26),//紧急联系人"古*松",//与本人关系"父女",//电话"149****999",// 工作经历workExperience(30),//熟用软件"excel/word/wps/photoshop",//语言能力-普通话"8级",//语言能力-英语"6级",//驾照"3年",//职称/资格"财务主管/8年",//爱好特长"拍照/旅游/跑步/运动/健身/看电影/听音乐/跳舞/唱歌/烹饪",//所获荣誉"2级会计证/4级会计证/6级会计证");}/*** 教育经历** @param mapKey* @return*/private List<Map<String, Object>> eduTables(int mapKey) {List<Map<String, Object>> dataList = new ArrayList<>();dataList.add(dataMap(mapKey, "大专", "xxx到xxx", "xxxxxx学院", "工商管理", "全日制", "无"));dataList.add(dataMap(mapKey, "本科", "xxx到xxx", "xxxxxx大学", "工商管理", "全日制", "学士学位"));dataList.add(dataMap(mapKey, "硕士", "xxx到xxx", "xxxxxx大学", "工商管理", "全日制", "硕士学位"));return dataList;}/*** 家庭成员** @param mapKey* @return*/private List<Map<String, Object>> familys(int mapKey) {List<Map<String, Object>> dataList = new ArrayList<>();dataList.add(dataMap(mapKey, "古*松", "父亲", "xxx", "xxxxxx股份公司", "xxx市xxx区xxx街道xxx小区xxx栋xxx号", "149****999"));dataList.add(dataMap(mapKey, "张*燕", "母亲", "xxx", "无", "xxx市xxx区xxx街道xxx小区xxx栋xxx号", "189****567"));return dataList;}/*** 工作经历** @param mapKey* @return*/private List<Map<String, Object>> workExperience(int mapKey) {List<Map<String, Object>> dataList = new ArrayList<>();dataList.add(dataMap(mapKey, "xxx到xxx", "xxxxxx有限公司", "财务助理/财务", "高*", "0**-0****28"));dataList.add(dataMap(mapKey, "xxx到xxx", "xxxxxx科技有限公司", "财务主管/财务", "王**", "0**-0****98"));return dataList;}/*** 设置response** @param fileName 文件名称* @param response* @throws Exception*/private void setHttpServletResponse(String fileName, HttpServletResponse response) throws Exception {response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");//docx文件response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8"));response.setHeader("filename", URLEncoder.encode(fileName + ".docx", "UTF-8"));response.setHeader("Access-Control-Expose-Headers", "filename");}/*** 组装数据对象** @param mapObjs* @return*/private Map<String, Object> dataMap(Object... mapObjs) {Map<String, Object> dataMap = new LinkedHashMap<>();if (ObjectUtils.isNotEmpty(mapObjs)) {int loops = StringUtils.isNumeric(String.valueOf(mapObjs[0])) ? 1 : 0;for (int i = loops; i < mapObjs.length; i++) {dataMap.put(loops == 0 ? String.valueOf(i) : String.format("%s-%d", mapObjs[0], i), mapObjs[i]);}}return dataMap;}

四、导出【个人简历】

如果你接口是使用的get请求,可以直接在通过链接测试,也就是在浏览器输入链接即可如果你的接口是使用的post请求,前端需要使用post方式提交否则可能报404也可以使用postman等接口测试工具测试效果

五、导出结果展示

六、Vue前端代码【element-ui】

下边的代码是部分代码,请求返回的时候可以直接使用下列代码,excel的导出也可以使用,亲测有效

const BLOB = response // Blob 对象表示一个不可变、原始数据的类文件对象(File 接口都是基于Blob)const fileReader = new FileReader() // FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件的内容fileReader.readAsDataURL(BLOB)// 开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容fileReader.onload = (event) => {// 处理load事件。该事件在读取操作完成时触发// 新建个下载的a标签,完成后移除。const a = document.createElement('a')a.download = "个人简历.docx";a.href = event.target.result;document.body.appendChild(a)a.click()document.body.removeChild(a)}

七、Poi-tl的使用说明文档链接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。