1,需求

  • 根据word模板文件,生成多个带日期后缀的word文件
  • 根据excel-每日告警统计数量,逐个修改当日的文档
    告警统计数据excel
    在这里插入图片描述

2,实现

  • shell脚本:根据word模板文件,生成多个带日期后缀的word文件
#!/bin/bash
# 生成近一年日期  日期格式:YYYYMMDD
#要复制的文档名称
baogao_doc_prename="巡检报告"
baogao_doc=$baogao_doc_prename".docx"#新文件生产后的目录
dest_dir=".\\"# 设置开始、结束时间
start_date=$(date -d "20250725" +%Y%m%d)  
end_date=$(date   -d "20250726" +%Y%m%d)  # 定义节假日数组(需用户自行补充)
# 格式:("YYYYMMDD" "YYYYMMDD" ...)
holidays=("20240101"  #"20250101" "20250201"   # 示例:元旦、春节(替换为实际节假日)
)# 循环生成日期并过滤节假日
current_sec=$(date -d "$start_date" +%s)
end_sec=$(date -d "$end_date" +%s)
day_count=0echo "近一年日期(排除节假日):"
while [ "$current_sec" -le "$end_sec" ]; docurrent_date=$(date -d "@$current_sec" +%Y%m%d)#复制文件cp $baogao_doc   $dest_dir/$baogao_doc_prename"-$current_date.docx"# 检查当前日期是否在节假日列表中if [[ ! " ${holidays[@]} " =~ " $current_date " ]]; thenecho "$current_date"((day_count++))fi# 增加一天(86400秒)current_sec=$((current_sec + 86400))
doneecho "生成完成!有效日期数: $day_count"
  • python脚本:根据excel-每日告警统计数量,逐个修改当日的文档
import pandas as pd
from docx import Document
from docx.table import _Cell
from docx.text.paragraph import Paragraph
import os
import re
from datetime import datetime, timedeltadef get_previous_day_filename(filename):# 定义日期格式的正则表达式date_pattern = r'(\d{8})'  # 匹配8位数字的日期格式# 查找文件名中的日期部分match = re.search(date_pattern, filename)if not match:print("错误: 文件名中未找到日期部分!")return None# 提取日期字符串并转换为日期对象date_str = match.group(1)try:date_obj = datetime.strptime(date_str, '%Y%m%d')except ValueError:print(f"错误: 日期格式不正确,应为YYYYMMDD,但得到了{date_str}")return None# 计算前一天的日期previous_day = date_obj - timedelta(days=1)previous_day_str = previous_day.strftime('%Y%m%d')# 替换文件名中的日期部分previous_day_filename = re.sub(date_pattern, previous_day_str, filename)return previous_day_filename#遍历段落并替换占位符
def replact_word_item( doc,  replacements ):for paragraph in doc.paragraphs:for key, value in replacements.items():if key in paragraph.text:# 替换文本内容(保留原有格式)inline = paragraph.runsfor run in inline:run.text = run.text.replace(key, str(value) )def edit_xjbaogao_table(doc, excel_row, word_filename):# 获取巡检报告表(根据文档结构定位第一个表格)inspection_table = doc.tables[0]total_result=[]# 遍历表格行(跳过表头行)for table_row in inspection_table.rows[1:]: #excel_index=excel_row.index   #excel 表格字段: @timestamp	Test1告警	Test2告警#巡检报告word表格: 巡检项目(系统) 巡检内容(事项) 正常与否	备注# 获取功能点名称(第一列)--系统,第二列)--巡检内容system = table_row.cells[0].text.strip()  #系统feature = table_row.cells[1].text.strip() #巡检内容# Test1模块巡检if system == 'Test1':alertCnt=int(excel_row['Test1告警'])if  alertCnt > 0:# 1. 更新(第4列,索引3): 备注result=str(alertCnt)+"次Test1告警"table_row.cells[3].text = "有"+ result +",均已反馈"#有xx告警,均已反馈                                      # 2. 更新(第3列,索引2): 巡检情况--- 判断值>0则勾选“不正常”              table_row.cells[2].text = "\r正常□\r不正常☑"total_result.append(result)# Test2模块巡检if system == 'Test2':alertCnt=int(excel_row['Test2告警'])if  alertCnt > 0:# 1. 更新(第4列,索引3): 备注result=str(alertCnt)+"次Test2告警"table_row.cells[3].text = "有"+ result +",均已反馈"#有xx告警,均已反馈                                      # 2. 更新(第3列,索引2): 巡检情况--- 判断值>0则勾选“不正常”              table_row.cells[2].text = "\r正常□\r不正常☑"total_result.append(result)# 巡检结论   strresult = ",".join(total_result)xunjian_result="有"+strresult+",均已反馈。"# 有xx1告警,xx2告警,均已反馈  if system == '巡检结论' and  "告警" in xunjian_result:            # 1. 更新(第2列,索引1): 巡检结论  table_row.cells[1].text = xunjian_result   print("xunjian_result===>",xunjian_result) #四、结论        #    + 拼接上次告警结论【上次出现的xx告警,xx2告警,均已处理。】 former_word_filename= get_previous_day_filename(word_filename) #xx巡检报告     former_result=''if os.path.exists(former_word_filename):print(f"获取前一天巡检报告文件{former_word_filename}")try:# 打开Word文档doc_former = Document(former_word_filename)except FileNotFoundError:print(f"未找到文件: {former_word_filename},跳过处理")#continue   # 获取巡检报告表(根据文档结构定位第一个表格)inspection_table_former = doc_former.tables[0]         # 遍历表格行(跳过表头行)for table_row in inspection_table_former.rows[1:]:                 #巡检报告word表格:巡检项目(系统)	巡检内容(事项)	    正常与否	备注# 获取功能点名称(第二列)--巡检内容system = table_row.cells[0].text.strip()  #系统if system == '巡检结论':            # 1. 更新(第2列,索引1): 巡检结论  former_result=table_row.cells[1].text former_result=former_result.replace("有", "上次出现的").replace("均已反馈", "均已处理")xunjian_result+=  former_result  replacements = {"各业务模块运行正常。":  xunjian_result}          if "告警" in xunjian_result:#print(xunjian_result)replact_word_item( doc,  replacements )  def update_word_remarks(excel_path, word_dir, word_file_prefix):"""从Excel读取数据,更新对应时间戳的Word文件备注栏:param excel_path: Excel文件路径:param word_dir: Word文件所在目录"""# 读取Excel数据df = pd.read_excel(excel_path, sheet_name='sheet1')# 遍历Excel中的每一行数据for _, excel_row in df.iterrows():timestamp = str(excel_row['@timestamp'])# 构造对应Word文件名f1=word_file_prefix[0]#1, xx巡检报告    word_filename = f"{word_dir}/{f1}-{timestamp}.docx"   if os.path.exists(word_filename):print(f"处理文件{word_filename}")try:# 打开Word文档doc = Document(word_filename)except FileNotFoundError:print(f"未找到文件: {word_filename},跳过处理")continue   # 匹配Excel中的字段并更新(第六列):备注edit_xjbaogao_table(doc, excel_row, word_filename)# 保存修改后的Word文件doc.save(word_filename)if __name__ == "__main__":# 配置文件路径(根据实际情况修改)EXCEL_PATH = "告警统计.xlsx"  # Excel文件路径WORD_DIRECTORY = "."       # Word文件所在目录(当前目录用".")word_file_prefix = ["巡检报告" ]update_word_remarks(EXCEL_PATH, WORD_DIRECTORY,word_file_prefix)

3,结果

在这里插入图片描述

在这里插入图片描述

4,合并多个word文件

  • pip install docxcompose
import os,re
from docx import Document
from docxcompose.composer import Composerdef extract_date_from_filename(filename):"""从文件名中提取日期,支持多种格式如:2024-03-15, 20240315, report_2024_03_15.docx"""basename = os.path.splitext(filename)[0]# 常见日期格式的正则patterns = [r'(\d{4})[-_]?(\d{2})[-_]?(\d{2})',  # 匹配 2024-03-15 或 20240315]for pattern in patterns:match = re.search(pattern, basename)if match:year, month, day = match.groups()return f"{year}-{month}-{day}"return "未知日期"def merge_word_files_with_titles(source_dir, output_file="merged_document.docx"):"""合并指定目录下所有.docx文件,并在每个文档内容前添加原文件名作为标题:param source_dir: 包含待合并Word文件的目录路径:param output_file: 合并后的输出文件名"""# 获取目录中所有.docx文件并按文件名排序files = [os.path.join(source_dir, f) for f in os.listdir(source_dir) if f.endswith(".docx")]#files.sort()files.sort(key=lambda x: extract_date_from_filename(x))if not files:print("目录中未找到.docx文件")return# 创建主文档master = Document()composer = Composer(master)for file_path in files:# 提取原文件名(不含后缀)作为标题file_name = os.path.splitext(os.path.basename(file_path))[0]# 创建临时文档添加标题title_doc = Document()title_doc.add_heading(file_name, level=1)  # 一级标题composer.append(title_doc)# 添加原文档内容content_doc = Document(file_path)composer.append(content_doc)# 添加分页符(非最后一个文档)if file_path != files[-1]:page_break = Document()page_break.add_page_break()composer.append(page_break)# 保存合并结果composer.save(output_file)print(f"合并完成!文件已保存至: {output_file}")# 示例用法
if __name__ == "__main__":merge_word_files_with_titles(source_dir=r"./old2",  # 替换为实际路径output_file="./old-合并报告.docx")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93542.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93542.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93542.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于uni-app的血糖血压刻度滑动控件

想要做一个基于uni-app的血糖血压刻度滑动控件&#xff0c;hbuilder市场没有好的&#xff0c;参照别人的写了一个。如图&#xff1a;源码&#xff0c;自己放入components里面。<!-- 刻度滑动选择 --> <template><view><view class"slide-title"…

C语言(02)——标准库函数大全(持续更新)

想要了解更多的C语言知识&#xff0c;可以订阅下面的专栏&#xff0c;里面也有很多品质好文&#xff1a; 打怪升级之路——C语言之路_ankleless的博客-CSDN博客 还在持续更新中&#xff0c;以下是学习过程中遇到的一些库函数&#xff08;排序不分先后&#xff09;&#xff1a…

永磁同步电机无速度算法--静态补偿电压模型Harnefors观测器

一、原理介绍本文基于Harnefors教授提出的静态补偿电压模型&#xff0c;可以实现带载零速启动、正反转切换等功能&#xff0c;原理清晰&#xff0c;实现简便。二、仿真模型在MATLAB/simulink里面验证所提算法&#xff0c;搭建仿真。采用和实验中一致的控制周期1e-4&#xff0c;…

[SKE]Python gmssl库的C绑定

Python gmssl库的C绑定 摘要:本文展示gmssl库的C绑定,并给出完整代码。将参考模型从Python脚本迁移到纯C代码中使用gmssl库(TongSuo项目,支持国密算法如SM4,同时兼容AES、DES、3DES、RSA等)。这样,UVM(SystemVerilog)可以通过DPI-C直接调用C函数,而无需嵌入Py…

4.方法的使用

方法是指一段具有独立功能的代码块&#xff0c;只有被调用时才会执行方法的主要作用体现在&#xff1a;代码组织&#xff1a;将原本挤在一起的臃肿代码按照功能进行分类管理例如&#xff1a;将用户注册的验证逻辑、数据库操作、结果返回等分离成不同方法提高复用性&#xff1a;…

day21-Excel文件解析

目录 1. 概述 2. Apache POI 3. XSSF解析Excel文件 3.1. 添加Jar包依赖 3.2. Workbook&#xff08;Excel文件&#xff09; 3.2.2. 加载&#xff08;解析&#xff09;Excel文件 3.3. Sheet &#xff08;工作簿&#xff09; 3.3.1. 创建工作簿 3.3.2. 获取工作簿 3.3.3.…

与 TRON (波场) 区块链进行交互的命令行工具 (CLI): tstroncli

源码仓库 一个基于 Node.js 和 TypeScript 构建的&#xff0c;用于与 TRON (波场) 区块链进行交互的命令行工具 (CLI)。 本项目旨在提供一个简单、可扩展的框架&#xff0c;让开发者可以轻松地通过命令行调用 TRON 的 HTTP API&#xff0c;实现查询链上信息、发送交易等操作。…

rabbitmq--默认模式(点对点)

导入包&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>application.yml springrabbitmq:host: localhostport: 5672username: guestpassword: gue…

外网访问文档编辑器Docsify(Windows版本),内网穿透技术应用简便方法

如果你正在为项目写文档&#xff0c;但又不想折腾复杂的构建流程&#xff0c;也不想维护一堆静态 HTML 文件&#xff0c;那你一定要试试 docsify。docsify 是一个基于 JavaScript 的开源文档生成工具&#xff0c;它最大的特点就是“无构建”&#xff1a;你只需要写 Markdown 文…

第4章唯一ID生成器——4.5 美团点评开源方案Leaf

Leaf是美团点评公司基础研发平台推出的一个唯一ID生成器服务&#xff0c;其具备高可靠性、低延迟、全局唯一等特点&#xff0c;目前已经被广泛应用于美团金融、美团外卖、美团酒旅等多个部门。Leaf根据不同业务的需求分别实现了Leaf-segment和Leaf-snowflake两种方案&#xff0…

分布式搜索和分析引擎Elasticsearch实战指南

ES 介绍与安装 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;restful 风格接口&#xff0c;多数据源…

【13】C# 窗体应用WinForm——.NET Framework、WinForm、工程创建、工具箱简介、窗体属性及创建

文章目录1. WinForm工程创建 及 界面介绍1.1 WinForm工程创建1.2 窗体 Form1.cs “查看代码”1.3 打开窗体设计器2. 工具箱3. 窗体属性及创建3.1 窗体属性3.2 实例&#xff1a;创建一个新窗体3.2.1 添加新Windows窗体3.2.2 窗体属性配置3.2.3 设置该窗体为启动窗体WinForm 是 W…

论文阅读-IGEV

文章目录1 概述2 模块2.1 总体说明2.2 特征抽取器2.3 CGEV2.4 基于Conv-GRU的更新算子2.5 空间上采样2.6 损失函数3 效果参考文献1 概述 在双目深度估计中&#xff0c;有一类是基于3D卷积的方法&#xff0c;代表就是PSMNet&#xff0c;它应用 3D 卷积编码器-解码器来聚合和正则…

[2025CVPR-图象分类方向]SPARC:用于视觉语言模型中零样本多标签识别的分数提示和自适应融合

1. ​背景与问题定义​ 视觉语言模型&#xff08;如CLIP&#xff09;在单标签识别中表现出色&#xff0c;但在零样本多标签识别&#xff08;MLR&#xff09;任务中表现不佳。MLR要求模型识别图像中多个对象&#xff08;例如&#xff0c;图像包含“猫”和“沙发”&#xff09;&…

2025创始人IP如何破局?

内容持续更新却无人点赞&#xff0c;课程精心打磨却无人报名&#xff0c;直播卖力讲解却无人停留 —— 明明有内容、有经验、有成果&#xff0c;却始终难以打动用户。问题的核心&#xff0c;或许在于你尚未打造出真正的 “创始人IP”。‌一、创始人IP&#xff1a;不止标签&…

告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践

一、Spring配置文件 1.1、什么是Spring配置 Spring配置指的是在Spring框架中定义和管理应用程序组件&#xff08;如Bean&#xff09;及其依赖关系的过程 作用&#xff1a; 配置文件主要用于解决硬编码问题&#xff0c;它将可能变更的信息集中存放。程序启动时&#xff0c;会从…

无人机喷洒系统技术要点与难点解析

一、 模块运行方式1. 任务规划与加载模块&#xff1a;输入&#xff1a;农田边界、障碍物信息、作物类型、病虫害信息、所需喷洒量、天气条件。运行&#xff1a;利用地面站软件或移动APP&#xff0c;规划最优飞行路径&#xff0c;设定飞行高度、速度、喷洒参数、作业区域。将规…

mongodb源代码分析createCollection命令创建Collection流程分析

MongoDB 提供两种方式创建集合&#xff1a;隐式创建 和 显式创建。方式 1&#xff1a;隐式创建&#xff08;推荐&#xff09;当你向不存在的集合中插入文档时&#xff0c;MongoDB 会自动创建该集合。示例在 db中隐式创建 users 集合&#xff1a;javascriptdb.users.insertOne({…

c++注意点(13)----设计模式(抽象工厂)

创建型模式抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们具体的类。简单说&#xff0c;它就像一个 "超级工厂"&#xff…

【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索

Transformer 如何工作&#xff1a;Transformer 架构的详细探索Transformer 如何工作&#xff1a;Transformer 架构的详细探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;历史背景从 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…