Files
CoverageConversionTool/覆盖率转换工具.py

118 lines
3.8 KiB
Python
Raw Normal View History

2026-07-13 17:47:24 +08:00
import re
import openpyxl
from pathlib import Path
import time
import sys
import os
def txt_to_xlsx():
try:
print("正在启动覆盖率转换工具...")
print("正在搜索目录中的txt文件...")
# 获取当前工作目录(兼容打包前后)
if getattr(sys, 'frozen', False):
# 如果是打包后的exe运行
current_dir = Path(os.path.dirname(sys.executable))
else:
# 如果是直接运行Python脚本
current_dir = Path(__file__).parent
print(f"当前工作目录: {current_dir}")
# 查找当前目录下的所有txt文件
txt_files = list(current_dir.glob("*.txt"))
# 检查是否存在txt文件
if not txt_files:
print("没有文件请将txt文件放入当前目录后重试")
return
print(f"找到 {len(txt_files)} 个txt文件正在处理第一个文件: {txt_files[0].name}")
# 使用找到的第一个txt文件
txt_path = txt_files[0]
xlsx_path = current_dir / "coverage_summary.xlsx"
text = txt_path.read_text(encoding="utf-8")
# 创建Excel工作簿
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Coverage Summary"
# 表头 - 只包含指标名称和覆盖率
headers = [
"File",
"Stmts", "Stmts % Covered",
"Branches", "Branches % Covered",
"FEC Condition Terms", "FEC Condition Terms % Covered",
"FEC Expression Terms", "FEC Expression Terms % Covered",
"FSM States", "FSM States % Covered",
"FSM Transitions", "FSM Transitions % Covered"
]
ws.append(headers)
# 按文件分割内容
files = re.split(r"={80}\n=== File: (.+?)\n={80}", text)
# 解析每个文件内容
for i in range(1, len(files), 2):
file_path = files[i].strip()
content = files[i+1]
# 提取文件名(去掉路径)
file_name = Path(file_path).name
# 初始化行数据
row = [file_name]
# 定义要提取的指标
metrics = [
"Stmts",
"Branches",
"FEC Condition Terms",
"FEC Expression Terms",
"States", # FSM States
"Transitions" # FSM Transitions
]
# 为每个指标提取数据
for metric in metrics:
# 构建正则表达式模式
pattern = rf"^\s*{re.escape(metric)}\b\s+(\d+)\s+\d+\s+\d+\s+([\d\.]+)%?$"
# 查找匹配项
match = re.search(pattern, content, flags=re.M)
if match:
count, percent = match.groups()
row.extend([count, f"{percent}%"])
else:
# 如果没有找到特定指标,统一填入 "/"
row.extend(["/", "/"])
ws.append(row)
# 自动调整列宽
for col in ws.columns:
max_len = max(len(str(cell.value or "")) for cell in col)
ws.column_dimensions[col[0].column_letter].width = max(10, min(50, max_len + 2))
# 保存Excel文件
wb.save(xlsx_path)
print(f"完成转换: {xlsx_path}")
except Exception as e:
print(f"发生错误: {e}")
import traceback
traceback.print_exc()
finally:
# 等待10秒防止窗口闪退
print("程序将在10秒后退出...")
time.sleep(10)
# 直接调用函数,无需传入参数
if __name__ == "__main__":
txt_to_xlsx()