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

替换word中的excel

@PostMapping("/make/report/target/performance/first")
public AjaxResult makeTargetReportFirst(@RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap = new HashMap<>();// 替换日期LocalDateTime nowData = LocalDateTime.now();DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");textReplaceMap.put("${nowDate}", nowData.format(dateFormatter));String templatePath = uploadPklExcelPath + "template1.docx";String directoryPath = fileUploadDir;try {if (!Files.exists(Paths.get(directoryPath))) {Files.createDirectories(Paths.get(directoryPath));}try (InputStream is = new FileInputStream(templatePath);XWPFDocument doc = new XWPFDocument(is)) {// 替换普通文本占位符(段落和表格内文本)replaceTextPlaceholders(doc, textReplaceMap);List<List<String>> excelData = makeReportDTO.getExcelData();if (excelData == null || excelData.isEmpty()) {return AjaxResult.error("excelData不能为空");}// 替换表格内容,按列替换,且新增行replaceTableDataByColumns(doc, excelData);// 生成唯一文件名String fileName = generateUniqueFileName();String outPath = directoryPath + fileName;try (OutputStream os = new FileOutputStream(outPath)) {doc.write(os);}return AjaxResult.success(outPath);}} catch (FileNotFoundException e) {return AjaxResult.error("文件未找到:" + e.getMessage());} catch (Exception e) {e.printStackTrace();return AjaxResult.error("报告生成失败:" + e.getMessage());}
}private void replaceTextPlaceholders(XWPFDocument doc, Map<String, String> replaceMap) {// 替换段落中的占位符doc.getParagraphs().forEach(paragraph -> {paragraph.getRuns().forEach(run -> {String text = run.getText(0);if (text != null) {for (Map.Entry<String, String> entry : replaceMap.entrySet()) {if (text.contains(entry.getKey())) {run.setText(text.replace(entry.getKey(), entry.getValue()), 0);}}}});});// 替换表格中的占位符doc.getTables().forEach(table -> {table.getRows().forEach(row -> {row.getTableCells().forEach(cell -> {cell.getParagraphs().forEach(paragraph -> {paragraph.getRuns().forEach(run -> {String text = run.getText(0);if (text != null) {for (Map.Entry<String, String> entry : replaceMap.entrySet()) {if (text.contains(entry.getKey())) {run.setText(text.replace(entry.getKey(), entry.getValue()), 0);}}}});});});});});}private void replaceTableDataByColumns(XWPFDocument doc, List<List<String>> excelData) {if (doc.getTables().isEmpty()) {throw new IllegalArgumentException("模板中没有表格");}XWPFTable table = doc.getTables().get(0);// 求最大行数int maxRowCount = excelData.stream().mapToInt(List::size).max().orElse(0);int templateRowCount = table.getNumberOfRows();// 不够行就新增for (int i = templateRowCount; i < maxRowCount; i++) {table.createRow();}for (int col = 0; col < excelData.size(); col++) {List<String> colData = excelData.get(col);for (int row = 0; row < maxRowCount; row++) {XWPFTableRow tableRow = table.getRow(row);// 设置固定高度为 5mm(约 284 Twips)tableRow.setHeight(284);tableRow.setHeightRule(TableRowHeightRule.EXACT);// 确保当前行有对应列单元格while (tableRow.getTableCells().size() <= col) {tableRow.createCell();}XWPFTableCell cell = tableRow.getCell(col);// 清空旧内容cell.removeParagraph(0);// 写入新文本并设置字体样式为小四宋体(12pt)XWPFParagraph paragraph = cell.addParagraph();XWPFRun run = paragraph.createRun();String text = row < colData.size() ? colData.get(row) : "";run.setText(text);run.setFontFamily("宋体");run.setFontSize(10); // 小四:12pt}}}private String generateUniqueFileName() {long timestamp = System.currentTimeMillis();int randomNum = new Random().nextInt(10000);return timestamp + "_" + randomNum + ".docx";}

在这里插入图片描述
在这里插入图片描述

{"excelData": [["水用量","水泥用量","水泥-种类","水泥-细度","水泥-28天抗压强度","矿粉用量","矿粉-细度","矿粉-28天活性指数","粉煤灰用量","粉煤灰-细度","粉煤灰-28天活性指数","砂用量","砂-细度","砂-石粉含量","石用量","石-含泥量","石-压碎指标值","减水剂用量","减水剂-含固量","减水剂-水泥净浆流动度","增效剂用量","坍落度","3天抗压强度","7天抗压强度","28天抗压强度"],["150","145","0","1.6","57.7","50","3.9","106","90","32.4","73","895","2.84","9.40","1010","0.92","0","10","11.5","190","1.43","205","22.5","31.8","47.6"]]
}

相关文章:

替换word中的excel

PostMapping("/make/report/target/performance/first") public AjaxResult makeTargetReportFirst(RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap new HashMap<>();// 替换日期LocalDateTime nowData LocalDateTime…...

大模型服务如何实现高并发与低延迟

写在前面 大型语言模型(LLM)正以前所未有的速度渗透到各行各业,从智能客服、内容创作到代码生成、企业知识库,其应用场景日益丰富。然而,将这些强大的 AI 能力转化为稳定、高效、可大规模应用的服务,却面临着巨大的挑战,其中高并发处理能力和低响应延迟是衡量服务质量的…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

OBS Studio:windows免费开源的直播与录屏软件

OBS Studio是一款免费、开源且跨平台的直播与录屏软件。其支持 Windows、macOS 和 Linux。OBS适用于&#xff0c;有直播需求的人群或录屏需求的人群。 Stars 数64,323Forks 数8413 主要特点 推流&#xff1a;OBS Studio 支持将视频实时推流至多个平台&#xff0c;如 YouTube、…...

[ 计算机网络 ] | 宏观谈谈计算机网络

&#xff08;目录占位&#xff09; 网络间通信&#xff0c;本质是不同的两个用户通信&#xff1b;本质是两个不同主机上的两个进程间通信。 因为物理距离的提升&#xff0c;就衍生出了很多问题。TCP/IP协议栈 / OSI七层模型&#xff0c;将协议分层&#xff0c;每一层都是为了…...

经典面试题:TCP 三次握手、四次挥手详解

在网络通信的复杂架构里&#xff0c;“三次握手”与“四次挥手”仿若一座无形的桥梁&#xff0c;它们是连接客户端与服务器的关键纽带。这座“桥梁”不仅确保了连接的稳固建立&#xff0c;还保障了连接的有序结束&#xff0c;使得网络世界中的信息能够顺畅、准确地流动。 在面…...

高光谱数据处理技术相关

一、Savitzky-Golay(SG)平滑 1. 基本概念 Savitzky-Golay(SG)平滑是一种基于局部多项式拟合的卷积算法,主要用于信号处理(如光谱、色谱数据)的去噪和平滑。其核心思想是通过滑动窗口内的多项式拟合来保留信号的原始特征(如峰形、宽度),同时抑制高频噪声。 2. 技术原…...

【动态规划】P10988 [蓝桥杯 2023 国 Python A] 走方格|普及+

本文涉及知识点 C动态规划 P10988 [蓝桥杯 2023 国 Python A] 走方格 题目描述 给定一个 N N N 行 N N N 列的方格&#xff0c;第 i i i 行第 j j j 列的方格坐标为 ( i , j ) (i, j) (i,j)&#xff0c;高度为 H i , j H_{i,j} Hi,j​。小蓝从左上角坐标 ( 0 , 0 ) …...

Rocketmq leader选举机制,通过美国大选解释

通过2020年美国大选的比喻&#xff0c;可以形象地解释RocketMQ的Leader选举机制&#xff08;以DLedger模式为例&#xff09;。我们将美国大选中的关键角色和流程映射到RocketMQ的集群中&#xff0c;帮助理解其工作原理。 1. 角色类比 美国大选RocketMQ DLedger集群说明选民&am…...

机器视觉的PVC卷对卷丝印应用

在现代工业制造领域&#xff0c;PVC卷对卷丝印工艺凭借其高效、灵活的特点&#xff0c;广泛应用于广告制作、包装印刷、电子产品装饰等多个行业。然而&#xff0c;在高速连续的丝印过程中&#xff0c;如何确保印刷图案的精准定位、色彩一致性以及质量稳定性&#xff0c;一直是困…...

利用 SQL Server 作业实现异步任务处理,简化系统架构

在现代企业系统中&#xff0c;异步任务是不可或缺的组成部分&#xff0c;例如&#xff1a; 电商系统中的订单超时取消&#xff1b; 报表系统中的异步数据导出&#xff1b; CRM 系统中的客户积分计算。 传统的实现方式通常涉及引入消息队列&#xff08;如 RabbitMQ、Kafka&a…...

LabVIEW数据库使用说明

介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询&#xff0c;适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit&#xff0c;可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述&#xff1a;实现向数据库表中插入数据的操作。当输入…...

MATLAB实现GAN用于图像分类

生成对抗网络&#xff08;GAN&#xff09;是一种强大的生成模型&#xff0c;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;组成。生成器用于生成图像&#xff0c;判别器用于判断图像是真实的还是生成的。在MATLAB中实现GAN用于图像…...

25考研经验贴(11408)

声明&#xff1a;以下内容都仅代表个人观点 数学一&#xff08;130&#xff09; 25考研数学一难度介绍&#xff1a;今年数学一整体不难&#xff0c;尤其是选填部分&#xff0c;大题的二型线面和概率论大题个人感觉比较奇怪&#xff0c;其他大题还是比较容易的。.26如何准备&a…...

java中的Filter使用详解

Filter&#xff08;过滤器&#xff09;是 Java Web 开发的核心组件之一&#xff0c;用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析&#xff1a; 一、Filter 的作用与原理 核心作用 Filter 充当请求与响应之间的…...

PostgreSQL初体验

目录 一、PostgreSQL 核心概述 &#xff08;一&#xff09;定义与定位 &#xff08;二&#xff09;核心特性与优势 &#xff08;三&#xff09;应用场景 二、PostgreSQL 安装实战&#xff08;基于 OpenEuler 24&#xff09; &#xff08;一&#xff09;编译安装&#xff…...

css使用clip-path属性切割显示可见内容

1. 需求 想要实现一个渐变的箭头Dom&#xff0c;不想使用svg、canvas去画&#xff0c;可以考虑使用css的clip-path属性切割显示内容。 2. 实现 <div class"arrow">箭头 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…...

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…...

Linux 文件(2)

文章目录 1. 文件描述符1.1 文件描述符是什么1.2 文件描述符如何分配 2 重定向2.1 输出重定向2.2 输入重定向2.3 使用dup2进行重定向 3. 文件、父子进程和进程替换 1. 文件描述符 1.1 文件描述符是什么 什么是文件描述符呢&#xff1f; 我们先来看之前所介绍的系统级别的文件…...

分析 redis 的 exists 命令有一个参数和多个参数的区别

在 redis 中&#xff0c;exists 命令是用来查询某个或多个 key 是否存在的&#xff0c;返回存在的 key 的个数。 由于 redis 是按照键值对方式存储数据的&#xff0c;于是一个 key 只能对应一组数据&#xff0c;那么上述的 key 的个数指的即是需要查询的 key 中有几个 key 是存…...

《具身智能机器人:自修复材料与智能结构设计的前沿探索》

在具身智能机器人的研发进程中&#xff0c;自修复材料与智能结构设计无疑是极具挑战性与创新性的关键领域&#xff0c;吸引着无数科研人员投身其中&#xff0c;探寻未知。 传统机器人在复杂多变的环境中执行任务时&#xff0c;一旦材料出现损伤&#xff0c;如外壳刮擦、内部线…...

Java 10IO流

IO流 input输入 output输出场景1&#xff1a;读写配置文件、日志文件 场景2&#xff1a;客户端与服务端的通讯 场景3&#xff1a;文件上传和下载io流体系结构 字节流 万能流&#xff0c;适合除纯文本文件外的储存字符流 纯文本文件字节流 FileOutputStream字节输出流 构造…...

@ColorRes和@ColorInt什么区别

ColorRes 和 ColorInt 都是 Android 的注解&#xff08;Annotations&#xff09;&#xff0c;用于标记你传递的参数到底是什么类型的“颜色”信息——资源 ID 还是实际颜色值。 ✅ 一句话理解 注解代表含义举例通常用在ColorRes表示这是一个颜色资源 ID&#xff08;如 R.colo…...

基于Springboot + vue3实现的工商局商家管理系统

项目描述 本系统包含管理员、商家两个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 许可证申请管理&#xff1a;管理商家的许可证申请&#xff0c;包括搜索、修改或删除许可证申请。 许可证审批管理…...

【Java ee初阶】HTTP(2)

一、HTTP的方法 方法 说明 支持的HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道…...

idea本地debug断点小技巧

idea本地debug断点小技巧 简单的设置断点条件 断点后&#xff0c;右键这个断点&#xff0c;可以在 condition 中填写能得出布尔的表达式 a 1 你如果写如下&#xff0c;表示先给他赋值&#xff0c;然后断住 a 2; true 断点后设置某个变量的值 在 debug 区域可以设置变量…...

21. 自动化测试框架开发之Excel配置文件的测试用例改造

21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...

避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践

​​1. 为什么需要动态IP&#xff1f;​​ 在日常网络操作中&#xff0c;你是否遇到过&#xff1a; ​​爬虫被封​​&#xff1a;频繁请求目标网站&#xff0c;IP被限制访问。​​跨境业务受限​​&#xff1a;某些平台对特定地区的账号有限制。​​数据采集失败​​&#x…...

python-leetcode 69.最小栈

题目&#xff1a; 设计一个支持push,pop,top,操作&#xff0c;并能在常数时间内检索到最小元素的栈。 辅助栈法&#xff1a; 1&#xff1a;使用两个栈&#xff0c;一个主栈用于存储所有元素&#xff0c;另一个辅助栈用于存储当前元素的最小值 2: 每次push时&#xff0c;将元…...

YOLO中model.predict方法返回内容Results详解

1.执行代码 resultsmodel.predict(YOLO/ultralytics/assets/zidane.jpg) print(results) 结果如下&#xff1a; 可以看出结果是一个数组形式&#xff0c;数组里每个元素都是Ultralytics的Results对象 1&#xff09;为什么结果是数组&#xff0c;而不是单个对象&#xff1f; …...