前言:
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
就表示map
的key
,如果你的数据对象
是实体对象
,那么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)}