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

Java查询数据放入word模板中并在前端导出下载

需求:查询数据放入word模板中并在前端导出下载

解决方法:在模板的位置定义参数如 {{name}}  {{age}}等等,使用 poi 处理

伪代码:

    @PostMapping("/practiceAppr")public AjaxResult practiceAppr(OutputStream outputStream, @RequestBody ExportToExcelParamDto paramDto) {//查询数据  ExportToWordByPracticeApprDto 为定义的模板中的参数ExportToWordByPracticeApprDto app= baseService.practiceApprExport(paramDto);try {//获取模板文件try (InputStream is = TrActivityGroupServiceImpl.class.getClassLoader().getResourceAsStream("word/导出模板A4.docx")) {try (XWPFDocument doc = new XWPFDocument(is)) {Map<String, Object> replaceMap = BeanUtil.beanToMap(app);Map<String, Object> resultMap = new HashMap<>();//word中的占位符格式是{{}}replaceMap.forEach((placeholder, replacement) -> resultMap.put("{{" + placeholder + "}}", replacement));//处理文件替换参数为实际值replacePlaceholders(doc, resultMap);doc.write(outputStream);outputStream.close();is.close();}}} catch (Exception e) {logger.error("文件导出错误{}", e.getMessage());}return null;}private void replacePlaceholders(XWPFDocument document, Map<String, Object> placeholders) throws IOException, InvalidFormatException {//处理普通word文字 不包含表格for (XWPFParagraph paragraph : document.getParagraphs()) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if (text != null) {for (Map.Entry<String, Object> entry : placeholders.entrySet()) {if (text.contains(entry.getKey())) {text = text.replace(entry.getKey(), entry.getValue() != null ? (String) entry.getValue() : "");run.setText(text, 0);}}}}}// 处理替换表格中的占位符for (XWPFTable table : document.getTables()) {for (XWPFTableRow row : table.getRows()) {for (XWPFTableCell cell : row.getTableCells()) {for (XWPFParagraph paragraph : cell.getParagraphs()) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if (text != null) {for (Map.Entry<String, Object> entry : placeholders.entrySet()) {if (text.contains(entry.getKey())) {//获取、处理图片略......int format = XWPFDocument.PICTURE_TYPE_PNG;//图片地址BufferedImage image = ImageIO.read(new URL(value));ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//suffix为图片的后缀 .pngImageIO.write(image, suffix, outputStream);byte[] imageBytes = outputStream.toByteArray();//后两个参数是宽高run.addPicture(new ByteArrayInputStream(imageBytes), format, fileName, Units.toEMU(80), Units.toEMU(40));//替换文字  图片和文字如果都展示text = text.replace(entry.getKey(), entry.getValue() != null ? (String) entry.getValue() : "");run.setText(text, 0);}}}}}}}}}

最后前端处理进行下载即可。

http://www.lryc.cn/news/241318.html

相关文章:

  • HarmonyOS ArkTS 应用添加弹窗(八)
  • 排序算法-----快速排序(非递归实现)
  • el-input限制输入整数等分析
  • 医院手术麻醉信息系统全套源码,自主版权,支持二次开发
  • canvas扩展001:利用fabric绘制图形,可以平移,旋转,放缩
  • 什么是机器学习
  • 电子桌牌如何赋能数字化会务?以深圳程序员节为例。
  • 打包和部署Java应用程序:Maven和Shell脚本的实用方法
  • Windows Python3安装salt模块失败处理
  • RabbitMQ 消息队列编程
  • 基于安卓android微信小程序的个人管理小程序
  • 免费图书教材配套资料:Spark大数据技术与应用(第2版)
  • SecureCRT9汉化版安装
  • 【VSCode】VSCode 使用
  • 【ARM 嵌入式 编译系列 2.2 -- 如何在Makefile 中添加编译时间 | 编译作者| 编译 git id】
  • 海康威视监控相机的SDK与opencv调用(非工业相机)
  • VUE项目部署过程中遇到的错误:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)
  • MongoDB——索引(单索引,复合索引,索引创建、使用)
  • ebpf实战(一)-------监控udp延迟
  • 中西部各省市翻译协会、公关协会会长金秋圆桌会议圆满结束
  • 极盾故事|“五步”构建某三甲医院数据安全管理集成平台
  • 【开题报告】基于uni-app的恋爱打卡app的设计与实现
  • Python 2.7 在 Debian 服务器上获取 URL 时的 SSL 验证失败问题与解决方案
  • 导出文件到指定路径??
  • 腾讯微服务平台TSF学习笔记(二)--如何使用spring cloud zuul实现线上流量复制
  • React自定义Hook之useRequest
  • 【LeetCode】挑战100天 Day13(热题+面试经典150题)
  • Android 11.0 SystemUI 去掉状态栏wifi流量上下行图标功能实现
  • 掌握Net User命令:轻松创建、修改、删除和查看本地用户帐户
  • 性能优化中使用Profiler进行页面卡顿的排查及解决方式