我想做一个把工程的所有收口概算(软件版和导出版都行)都输入进去,然后把每个单体的概算 招标费、施工过程造价咨询及竣工结算审核费、施工图评审费,都提取出来,然后自动计算出各单体的造价咨询拦标价和施工图预算审查拦标价,和他们的总和,输出一张表格。 根据您提供的详细规则,我将为您设计一个**Python自动化脚本**,实现从符合特定规则的Excel文件中提取三类费用数据并汇总输出。以下是完整解决方案: --- ### ​**一、Python脚本设计**​ #### ​**1. 功能模块**​ - ​**文件遍历**​:自动读取指定文件夹内所有Excel文件。 - ​**文件名分类**​:根据关键词匹配确定目标Sheet名称。 - ​**数据提取**​:定位Sheet页签,按固定列(B列名称/D列金额)提取三类费用。 - ​**结果汇总**​:生成包含单体标识和费用数据的汇总表。 - ​**错误处理**​:记录缺失字段或异常文件。 #### ​**2. 依赖库**​ ``` import os import pandas as pd import re from openpyxl import load_workbook ``` --- ### ​**二、完整代码实现**​ ``` import os import pandas as pd import re def classify_sheet_name(filename): """根据文件名关键词返回对应的Sheet名称""" if any(keyword in filename for keyword in ["变电工程", "间隔扩建工程", "保护改造工程"]): return "变电站工程其他费用概算表" elif all(keyword in filename for keyword in ["线路工程", "架空部分"]): return "架空输电线路其他费用概算表" elif all(keyword in filename for keyword in ["线路工程", "电缆部分"]): return "电缆输电线路其他费用概算表" else: raise ValueError(f"无法识别的文件类型: {filename}") def extract_fee_data(filepath, sheet_name): """从指定Sheet中提取三类费用数据""" try: # 使用openpyxl直接读取Sheet(避免pandas自动转换格式) wb = load_workbook(filepath, read_only=True) ws = wb[sheet_name] # 初始化结果字典 fee_data = { "招标费": None, "施工过程造价咨询及竣工结算审核费": None, "施工图评审费": None } # 遍历Sheet行数据(假设表头在第一行) for row in ws.iter_rows(min_row=2, values_only=True): # 跳过表头 fee_name = row[1] # B列(索引1)为费用名称 fee_amount = row[3] # D列(索引3)为费用金额 if fee_name in fee_data: fee_data[fee_name] = fee_amount wb.close() return fee_data except Exception as e: print(f"文件 {filepath} 处理失败: {str(e)}") return None def main(input_folder, output_file): """主函数:批量处理文件并生成汇总表""" results = [] error_files = [] # 遍历输入文件夹 for filename in os.listdir(input_folder): if not filename.endswith(('.xlsx', '.xls')): continue filepath = os.path.join(input_folder, filename) try: # 1. 从文件名提取单体标识(如"1号楼概算.xlsx" → "1号楼") match = re.search(r'([^\\\/]+?)概算\.xlsx', filename) if not match: raise ValueError(f"文件名格式错误: {filename}") unit_name = match.group(1) # 2. 分类确定Sheet名称 sheet_name = classify_sheet_name(filename) # 3. 提取费用数据 fee_data = extract_fee_data(filepath, sheet_name) if fee_data is None: error_files.append(filename) continue # 4. 检查是否缺失字段 missing_fields = [k for k, v in fee_data.items() if v is None] if missing_fields: raise ValueError(f"缺失字段: {missing_fields}") # 5. 添加到结果列表 results.append({ "单体标识": unit_name, "招标费": fee_data["招标费"], "施工过程造价咨询及竣工结算审核费": fee_data["施工过程造价咨询及竣工结算审核费"], "施工图评审费": fee_data["施工图评审费"] }) except Exception as e: print(f"文件 {filename} 处理异常: {str(e)}") error_files.append(filename) # 6. 生成汇总表 if results: df = pd.DataFrame(results) df.to_excel(output_file, index=False) print(f"汇总表已生成: {output_file}") else: print("未提取到有效数据!") # 7. 输出错误日志 if error_files: with open("error_log.txt", "w", encoding="utf-8") as f: f.write("处理失败的文件:\n" + "\n".join(error_files)) print(f"错误日志已保存: error_log.txt") if __name__ == "__main__": # 用户需修改以下路径 input_folder = r"C:\Users\YourName\Downloads\概算文件" # 替换为实际文件夹路径 output_file = r"C:\Users\YourName\Downloads\费用汇总.xlsx" # 替换为输出文件路径 main(input_folder, output_file) ``` --- ### ​**三、使用说明**​ 1. ​**环境准备**​: - 安装Python 3.7+及依赖库: ``` pip install pandas openpyxl ``` 2. ​**脚本配置**​: - 修改代码中`input_folder`和`output_file`的路径为您的实际路径。 3. ​**运行脚本**​: - 双击运行或在命令行执行: ``` python extract_fee_data.py ``` 4. ​**结果查看**​: - 汇总表:生成的Excel文件包含所有单体的费用数据。 - 错误日志:`error_log.txt`记录处理失败的文件及原因。 --- ### ​**四、关键逻辑说明**​ 1. ​**Sheet名称分类**​: - 通过`classify_sheet_name()`函数实现文件名关键词匹配,严格遵循您提供的规则。 2. ​**费用提取**​: - 使用`openpyxl`直接读取单元格数据(避免pandas自动转换格式导致错误),按B列名称/D列金额精准定位。 3. ​**错误处理**​: - 捕获文件读取、字段缺失等异常,确保程序不中断,并记录详细日志。 --- ### ​**五、扩展建议**​ - ​**字段位置调整**​:若费用数据不在B/D列,修改`extract_fee_data()`中的列索引(如C列名称→索引2)。 - ​**批量测试**​:建议先用10个文件测试,确认无误后再处理全部数据。 如需进一步调整,请随时告知!