import os
import pandas as pd
from typing import Dict, List
def load_excel_data(folder_path: str) -> Dict[str, List[Dict]]:
"""
加载指定文件夹下所有Excel文件的关键数据
:param folder_path: 文件夹路径
:return: 字典,key=文件名,value=每行数据(包含B/C/E列+行号)
"""
all_data = {}
# 遍历文件夹下所有Excel文件(.xlsx/.xls)
for filename in os.listdir(folder_path):
if not filename.endswith((".xlsx", ".xls")):
continue # 跳过非Excel文件
file_path = os.path.join(folder_path, filename)
try:
# 读取Excel文件,以字符串格式避免数字/文本混淆
# header=None:无表头时用(若有表头可删除,或指定header=0)
df = pd.read_excel(file_path, dtype=str, header=None)
file_data = []
# 遍历每一行(跳过空行)
for row_idx, row in df.iterrows():
# 提取列:第二列(索引1)、第三列(索引2)、第五列(索引4)
col2 = row.iloc[1] if len(row) > 1 else "" # B列
col3 = row.iloc[2] if len(row) > 2 else "" # C列
col5 = row.iloc[4] if len(row) > 4 else "" # E列
# 跳过空数据
if pd.isna(col5) or col5.strip() == "":
continue
# 拆分第五列的多标识(如"R1,R2,C2"拆分为["R1","R2","C2"])
flags = [flag.strip() for flag in col5.split(",") if flag.strip()]
if not flags:
continue
# 保存该行数据
file_data.append({
"row_num": row_idx + 1, # 行号(Excel中从1开始)
"col2": col2.strip() if not pd.isna(col2) else "",
"col3": col3.strip() if not pd.isna(col3) else "",
"flags": flags
})
all_data[filename] = file_data
print(f"✅ 成功加载文件:{filename},有效数据行:{len(file_data)}")
except Exception as e:
print(f"❌ 读取文件{filename}失败:{e}")
continue
if not all_data:
print("⚠️ 文件夹下未找到有效Excel文件或数据")
return all_data
def search_flag(all_data: Dict, target_flag: str) -> None:
"""
根据输入的标识(如R1/C2)查询并打印对应行的第二、三列信息
:param all_data: 加载的Excel数据
:param target_flag: 要查询的标识(如R1、C2)
"""
target_flag = target_flag.strip()
if not target_flag:
print("⚠️ 请输入有效的标识(如R1、C2)")
return
# 记录匹配结果
match_count = 0
print(f"\n========== 查找标识「{target_flag}」的结果 ==========")
# 遍历所有文件的所有行
for filename, file_data in all_data.items():
for row_info in file_data:
if target_flag in row_info["flags"]:
match_count += 1
print(f"文件:{filename} | 行号:{row_info['row_num']}")
print(f"第二列:{row_info['col2']} | 第三列:{row_info['col3']}\n")
if match_count == 0:
print(f"❌ 未找到包含标识「{target_flag}」的记录")
else:
print(f"✅ 共找到 {match_count} 条匹配记录")
def main():
# 配置:修改为你的文件夹路径(绝对路径/相对路径均可)
FOLDER_PATH = "./excel_files" # 示例:当前目录下的excel_files文件夹
# FOLDER_PATH = "/home/user/excel_data" # Linux绝对路径
# FOLDER_PATH = "C:/Users/xxx/Documents/excel_data" # Windows绝对路径
# 第一步:加载所有Excel数据
print("开始加载Excel文件数据...")
all_data = load_excel_data(FOLDER_PATH)
if not all_data:
return
# 第二步:控制台交互查询
print("\n========== 进入查询模式 ==========")
print("输入要查询的标识(如R1、C2),输入'q'退出")
while True:
target_flag = input("\n请输入查询标识:")
if target_flag.lower() == "q":
print("退出程序...")
break
# 执行查询
search_flag(all_data, target_flag)
if __name__ == "__main__":
main()