针对您的需求,我将设计一个结合大模型(如ChatGPT)和Python脚本的解决方案,解决非结构化Excel数据提取的难题。以下是完整的实现方案:
动态数据定位问题
解决方案:关键词锚点 + 相对位置搜索
实现代码:
def find_data_by_anchor(worksheet, anchor_text, offset_row, offset_col): for row in worksheet.iter_rows(): for cell in row: if anchor_text in str(cell.value): return worksheet.cell( row=cell.row + offset_row, column=cell.column + offset_col ).value return None
计算字段处理
解决方案:公式描述 + Python计算引擎
示例配置:
{ "field_name": "bonus", "formula": "salary * 0.2 + performance_score * 100", "dependencies": ["salary", "performance_score"] }
多文件批量处理
def process_files(file_paths, config): results = {} for file_path in file_paths: wb = load_workbook(file_path) file_results = {} for item in config['extraction_rules']: # 执行提取逻辑 results[file_path] = file_results return results
目标文件无损写入
def write_to_target(target_path, data, positions): wb = load_workbook(target_path) ws = wb.active for field, value in data.items(): cell_ref = positions[field] ws[cell_ref] = value # 只修改指定单元格 wb.save(target_path)
准备阶段
创建配置文件 config.json
:
{ "extraction_rules": [ { "name": "employee_name", "anchor": "员工姓名", "offset": [0, 1], "data_type": "string" }, { "name": "total_salary", "formula": "base_salary + bonus - tax", "dependencies": ["base_salary", "bonus", "tax"] } ], "target_positions": { "employee_name": "Sheet1!B3", "total_salary": "Sheet1!C5" } }
主处理程序
import openpyxl import json import os from openai import OpenAI # 初始化大模型客户端 client = OpenAI(api_key="your_api_key") def extract_complex_data(question, context): response = client.chat.completions.create( model="gpt-4", messages=[{ "role": "user", "content": f"基于以下表格数据:\n{context}\n\n回答:{question}" }] ) return response.choices[0].message.content def process_excel(file_path, config): # 实现提取逻辑 # ... return extracted_data if __name__ == "__main__": with open("config.json") as f: config = json.load(f) files = ["file1.xlsx", "file2.xlsx"] output_path = "report.xlsx" # 备份原始文件 os.copy("template.xlsx", output_path) for file in files: data = process_excel(file, config) write_to_target(output_path, data, config["target_positions"])
智能表格检测
def detect_table_region(worksheet): # 使用大模型分析表格结构 table_data = [] for row in worksheet.iter_rows(max_row=10): table_data.append([cell.value for cell in row]) response = client.chat.completions.create( model="gpt-4", messages=[{ "role": "user", "content": f"识别表格的有效区域:\n{table_data}\n返回[开始行,结束行,开始列,结束列]" }] ) return eval(response.choices[0].message.content)
动态规则生成
def generate_extraction_rules(sample_file): # 上传示例文件给大模型分析 # 返回自动生成的提取规则
大模型使用建议
每次发送不超过100行×10列的数据
结构化提示词模板:
请从以下表格数据中提取信息: | 姓名 | 部门 | 工资 | |--------|--------|------| | 张三 | 技术部 | 8000| | ... | ... | ... | 问题:技术部的最高工资是多少?
性能优化
本地缓存已解析的表格结构
批量发送多个查询请求
设置合理的超时时间(建议10-15秒)
错误处理
try: # 数据处理逻辑 except Exception as e: log_error(f"处理失败:{str(e)}") # 尝试降级方案 fallback_extraction()
环境要求
Python 3.9+ 依赖库:openpyxl, openai, pandas
执行命令
python excel_extractor.py \ --input "data/*.xlsx" \ --config extraction_config.json \ --output final_report.xlsx
此方案通过结合大模型的语义理解能力和Python的精确控制,解决了非结构化Excel数据提取的核心痛点。对于特别复杂的表格,建议先进行人工标注1-2个示例文件,训练专用的小模型提高准确率。