我想做一个把工程的所有收口概算(软件版和导出版都行)都输入进去,然后把每个单体的概算 招标费、施工过程造价咨询及竣工结算审核费、施工图评审费,都提取出来,然后自动计算出各单体的造价咨询拦标价和施工图预算审查拦标价,和他们的总和,输出一张表格。
根据您提供的详细规则,我将为您设计一个**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个文件测试,确认无误后再处理全部数据。
如需进一步调整,请随时告知!