From 46ae47274d933b82dcfecdf01d9e65af9fabdd07 Mon Sep 17 00:00:00 2001 From: panxiang <1275280643@qq.com> Date: Thu, 5 Feb 2026 09:04:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=92=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htmlProcess/.gitignore | 2 +- .../htmlReportProcess_Merge_cmd/.gitignore | 30 + .../htmlReportProcess_Merge_cmd_V1.py | 434 ++++++ .../htmlReportProcess_cmd_p/.gitignore | 26 + .../htmlReportProcess_cmd_V1.py | 620 ++++++++ .../htmlReportProcess_cmd_pV1.py | 1172 ++++++++++++++ .../htmlReportProcess_picHtml/.gitignore | 33 + .../htmlReportProcess_picHtml_1kV1.py | 1053 +++++++++++++ .../htmlReportProcess_picHtml_2kV1.py | 1373 +++++++++++++++++ 9 files changed, 4742 insertions(+), 1 deletion(-) create mode 100644 htmlProcess/htmlReportProcess_Merge_cmd/.gitignore create mode 100644 htmlProcess/htmlReportProcess_Merge_cmd/htmlReportProcess_Merge_cmd_V1.py create mode 100644 htmlProcess/htmlReportProcess_cmd_p/.gitignore create mode 100644 htmlProcess/htmlReportProcess_cmd_p/htmlReportProcess_cmd_V1.py create mode 100644 htmlProcess/htmlReportProcess_cmd_p/htmlReportProcess_cmd_pV1.py create mode 100644 htmlProcess/htmlReportProcess_picHtml/.gitignore create mode 100644 htmlProcess/htmlReportProcess_picHtml/htmlReportProcess_picHtml_1kV1.py create mode 100644 htmlProcess/htmlReportProcess_picHtml/htmlReportProcess_picHtml_2kV1.py diff --git a/htmlProcess/.gitignore b/htmlProcess/.gitignore index 00c07ca..b2c001b 100644 --- a/htmlProcess/.gitignore +++ b/htmlProcess/.gitignore @@ -14,4 +14,4 @@ htmlReportProcess_Merge_picHtml_V2.py htmlReportProcess_Merge_pic_V2.py -/htmlReportProcess*/ \ No newline at end of file +#/htmlReportProcess*/ \ No newline at end of file diff --git a/htmlProcess/htmlReportProcess_Merge_cmd/.gitignore b/htmlProcess/htmlReportProcess_Merge_cmd/.gitignore new file mode 100644 index 0000000..cd13cee --- /dev/null +++ b/htmlProcess/htmlReportProcess_Merge_cmd/.gitignore @@ -0,0 +1,30 @@ +/build/* +/build +/dist/* +/dist +/source/* +/source + + + + +htmlReportProcess_Merge_picHtml_V3.py + +htmlReportProcess_Merge_picHtml_V2.py + +htmlReportProcess_Merge_pic_V2.py + +#/htmlReportProcess*/ + + +htmlReportProcess_cmd_pV2.py +htmlReportProcess_cmd_pV3.py + + +htmlReportProcess_cmd_V2.py + +htmlReportProcess.py + + +htmlReportProcess_Merge_cmd_V2.py +htmlReportProcess_Merge.py \ No newline at end of file diff --git a/htmlProcess/htmlReportProcess_Merge_cmd/htmlReportProcess_Merge_cmd_V1.py b/htmlProcess/htmlReportProcess_Merge_cmd/htmlReportProcess_Merge_cmd_V1.py new file mode 100644 index 0000000..6e8b4ee --- /dev/null +++ b/htmlProcess/htmlReportProcess_Merge_cmd/htmlReportProcess_Merge_cmd_V1.py @@ -0,0 +1,434 @@ +import os +import sys +import re +import time +import tkinter as tk +from tkinter import filedialog +from openpyxl import Workbook, load_workbook +from datetime import datetime + +from colorama import Fore, Style, init + +class TestReportMerger: + def __init__(self): + self.source_files = [] + self.merged_data = [] + self.output_filepath = "" + self.selected_folder = "" + # 进度统计 + self.stats = { + "total_files": 0, + "processed_files": 0, + "skipped_no_sheet": 0, + "errors": 0, + "total_rows_merged": 0 + } + + def _print_stage(self, msg): + print(f"\n=== {msg} ===") + + def _print_progress(self, current, total, prefix="处理进度"): + percent = (current / total * 100) if total else 0 + bar_len = 30 + filled = int(bar_len * current / total) if total else 0 + bar = "█" * filled + "-" * (bar_len - filled) + print(f"\r{prefix}: [{bar}] {current}/{total} ({percent:.1f}%)", end="", flush=True) + + def select_directory(self): + """选择包含测试报告的目录""" + root = tk.Tk() + root.withdraw() # 隐藏主窗口 + self.selected_folder = filedialog.askdirectory(title="选择包含测试报告的目录") + return self.selected_folder + + def _get_directory_from_console(self): + """从控制台获取目录路径""" + while True: + print(f"\n{Fore.CYAN}=== HTML-excel报告处理程序 ===") + print(f"{Fore.WHITE}请输入包含测试报告文件的目录路径:") + self.selected_folder = input("> ").strip() + + if not self.selected_folder: + print(f"{Fore.YELLOW}⚠ 路径不能为空,请重新输入") + continue + + # 处理路径中的引号 + self.selected_folder = self.selected_folder.strip('"\'') + + if not os.path.exists(self.selected_folder): + print(f"{Fore.RED}❌ 路径不存在,请重新输入") + continue + + if not os.path.isdir(self.selected_folder): + print(f"{Fore.RED}❌ 请输入目录路径,而不是文件路径") + continue + + return self.selected_folder + + + def scan_files(self): + """扫描目录下的Excel文件(仅处理 .xlsx,忽略临时文件)""" + if not self.selected_folder: + return False + + self._print_stage("扫描文件") + # 仅处理 .xlsx,忽略 ~$ 开头的临时文件 + files = [ + os.path.join(self.selected_folder, f) + for f in os.listdir(self.selected_folder) + if f.lower().endswith(".xlsx") and not f.startswith("~$") + ] + + self.source_files = files + self.stats["total_files"] = len(self.source_files) + + if self.stats["total_files"] == 0: + print("指定目录中没有找到可处理的 .xlsx 文件") + return False + + print(f"找到 {self.stats['total_files']} 个 .xlsx 文件") + return True + + @staticmethod + def _parse_source_filename(value): + """ + 解析 Source File name 字段,提取 SN、TestCycleTime、Cell。 + 支持形如: + Fxxxx(...日期时间...)-CELL.html + 例如:F27140001X3M00004013683JK00190(2025-09-22 09-03-22)-14.html + """ + sn, ts, cell = "", "", "" + if not value: + return sn, ts, cell + + # 只取基名,防止包含路径 + base = os.path.basename(str(value)).strip() + + # 主模式:SN(时间)-Cell[.扩展名] + m = re.match(r'^(?P[^()\-]+)\((?P