当前位置: 首页 > news >正文

基于word模板导出人员信息

接口基本信息

接口功能: 导出指定人员的个人信息文档

技术实现

1. 控制器层实现

/** * 导出人员个人信息 */@ApiOperationSupport(order=12)@ApiOperation("导出人员个人信息")@CommonLog("导出人员个人信息")@SaCheckPermission("/biz/user/exportUserInfo")@GetMapping(value="/biz/user/exportUserInfo",produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)publicvoidexportUserInfo(BizUserIdParambizUserIdParam,HttpServletResponseresponse)throwsIOException{bizUserService.exportUserInfo(bizUserIdParam,response);}

2. 服务层接口定义

/** * 导出用户个人信息 **/voidexportUserInfo(BizUserIdParambizUserIdParam,HttpServletResponseresponse)throwsIOException;

3. 服务层实现逻辑

@OverridepublicvoidexportUserInfo(BizUserIdParambizUserIdParam,HttpServletResponseresponse)throwsIOException{FiledestTemplateFile=null;FileresultFile=null;try{// 1. 根据ID查询用户信息BizUserbizUser=this.queryEntity(bizUserIdParam.getId());// 2. 数据转换(如机构信息翻译等)transService.transOne(bizUser);// 3. 读取Word模板文件InputStreaminputStream=POICacheManager.getFile("userExportTemplate.docx");// 创建临时模板文件destTemplateFile=FileUtil.writeFromStream(inputStream,FileUtil.file(FileUtil.getTmpDir()+File.separator+"userExportTemplate.docx"));// 4. 构造模板填充参数Map<String,Object>map=BeanUtil.beanToMap(bizUser);// 5. 处理头像数据StringavatarBase64;if(ObjectUtil.isNotEmpty(bizUser.getAvatar())){avatarBase64=bizUser.getAvatar();}else{// 如果没有头像,生成默认头像avatarBase64=CommonAvatarUtil.generateImg(bizUser.getName());}// 将头像转换为图片实体(120x160像素)ImageEntityimageEntity=newImageEntity(ImgUtil.toBytes(ImgUtil.toImage(StrUtil.split(avatarBase64,StrUtil.COMMA).get(1)),ImgUtil.IMAGE_TYPE_PNG),120,160);map.put("avatar",imageEntity);// 6. 计算年龄(如果有生日)if(ObjectUtil.isNotEmpty(bizUser.getBirthday())){try{longage=cn.hutool.core.date.DateUtil.betweenYear(cn.hutool.core.date.DateUtil.parseDate(bizUser.getBirthday()),DateTime.now(),true);if(age!=0){map.put("age",age+"岁");}}catch(Exceptionignored){// 生日格式解析失败,忽略年龄计算}}// 7. 添加导出时间map.put("exportDateTime",DateUtil.format(DateTime.now(),DatePattern.CHINESE_DATE_PATTERN));// 8. 使用模板生成Word文档XWPFDocumentdoc=WordExportUtil.exportWord07(destTemplateFile.getAbsolutePath(),map);// 9. 创建临时输出文件resultFile=FileUtil.file(FileUtil.getTmpDir()+File.separator+"SNOWY2.0系统B端人员信息_"+bizUser.getName()+".docx");// 10. 写入文件并响应下载BufferedOutputStreamoutputStream=FileUtil.getOutputStream(resultFile);doc.write(outputStream);outputStream.close();// 11. 下载文件CommonDownloadUtil.download(resultFile,response);}catch(Exceptione){log.error(">>> 导出人员个人信息异常:",e);CommonResponseUtil.renderError(response,"导出失败");}finally{// 12. 清理临时文件if(ObjectUtil.isNotEmpty(destTemplateFile)){FileUtil.del(destTemplateFile);}if(ObjectUtil.isNotEmpty(resultFile)){FileUtil.del(resultFile);}}}

依赖关系

核心依赖库

<!-- Word文档处理 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><!-- 文件操作工具 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><!-- 数据转换 --><dependency><groupId>com.fhs</groupId><artifactId>core-trans</artifactId><version>1.0.0</version></dependency>

总结

一个基于Word模板的人员个人信息导出功能,通过模板引擎将用户数据填充到Word文档中,支持头像处理和动态字段计算(如年龄计算),最终生成个性化的个人信息文档。该接口具有完善的错误处理和资源清理机制,确保系统稳定性和用户体验。

http://www.cnnetsun.cn/news/2883378.html

相关文章:

  • 别再乱调参数了!APEX压枪宏原理详解:从罗技Lua脚本看鼠标移动模拟
  • 从5G基带到智能音箱:CEVA BX2 DSP实战选型与开发环境搭建指南
  • ANSYS_APDL——实例解析:利用SOLID65与局部坐标系实现圆柱结构精细化配筋
  • PCB Layout实战避坑指南:从原理到布线的关键检查点
  • 从一道经典极限题出发,聊聊1^∞型背后的“e”和自然增长
  • 别再死记硬背了!用Python和C语言对比,轻松搞懂科学计数法E/e的底层逻辑
  • Django图书管理系统实战源码包:含MySQL建库脚本、带注释Python代码与运行截图
  • rf 强化学习第五章 广义优势估计(GAE)部分(共五章)
  • Vivado功耗报告(Report Power)实战:从布线后分析到散热设计,一个报告全搞定
  • MATLAB一键运行图像DFT频谱分析:含灰度转换、中心化频谱图与逆变换重建
  • PyTorch模型部署实战:model.eval()和torch.no_grad()到底该用哪个?附Flask API示例
  • 从微程序入口逻辑看CPU设计:为什么你的单总线CPU时序仿真总出错?(以HUST实验为例)
  • GNN实战代码集:GCN与GraphSAGE实现节点分类、边预测、交通流建模及过平滑分析
  • MPC8560高速接口设计实战:DDR与以太网时序规范与PCB实现
  • 别死记硬背GCD公式!用‘乐高积木’思维图解递归,轻松玩转分数计算
  • GEE实战:像元二分法反演区域植被覆盖度(FVC)的技术流程与调优
  • 激光雷达3D检测新思路:手把手拆解FSDv2的‘虚拟体素’与‘投票中心’(WOD/nuScenes实测)
  • 别再只靠拉开距离了!实测告诉你PCB上天线隔离度差10dB的真实原因
  • 3D大模型位置编码:C2RoPE的创新与突破
  • 从‘你好’到完整回复:一步步图解ChatGLM2-6B的推理循环(附KV Cache原理)
  • 不只是空气和水:格子玻尔兹曼方法(LBM)在电池散热与芯片设计中的实战案例拆解
  • Java开发工具全解析:提升开发效率的秘密武器
  • Courant-Fischer定理如何解释PCA主成分的选取?一个数据降维的极值原理故事
  • WordPress Porto 主题后台一直提示 Porto Functionality 插件需要更新,如何隐藏?
  • 如何在24GB以下显卡上玩转AI图像生成?FLUX.1-dev FP8模型深度体验
  • ARM Cortex-M DWT CYCCNT 必须显式初始化,jlink调试时正常,使用时异常的问题
  • YOLOv8保姆级调优指南:从CSPDarknet53到PANet,手把手教你提升目标检测精度
  • 鸿蒙导航意图 的 Flutter 侧封装思路
  • 手把手教你用PHY6222芯片的simpleBLEPeripheral例程,从广播数据到属性表一次搞懂
  • 5KB内实现适用于curses的克朗代克纸牌游戏:参加IOCCC的独特尝试!