Python批量生成N天前的多word個文件,并根據excel統計數據,修改word模板,合并多個word文件

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…