1. 项目概述
每次月底盘点水果库存时,你是不是也对着几十张Excel表格发愁?从不同门店收集来的销售数据格式五花八门,手动复制粘贴不仅容易出错,还特别耗时。去年夏天我在连锁水果店做系统升级时就遇到过这个痛点 - 当时财务部的同事每周要花6个小时做数据汇总,还经常因为漏统计被老板批评。
这个Python脚本就是为了解决这个具体场景设计的。它能够自动识别不同格式的Excel文件,提取其中的水果品类和对应数量,最终生成一份标准化的汇总报表。最棒的是,整个过程完全不需要打开Excel,后台自动运行,3分钟就能完成原本需要半天的工作量。
2. 核心功能解析
2.1 多格式文件兼容
传统VBA脚本最大的问题就是遇到格式变化的文件就会报错。我们的解决方案是采用智能识别策略:
- 首先尝试用pandas直接读取(兼容xls/xlsx)
- 如果失败,转为使用openpyxl逐行扫描
- 通过关键词匹配定位数据区域(比如搜索"苹果"、"香蕉"等水果名称)
def detect_data_sheet(file_path): try: df = pd.read_excel(file_path) if '品类' in df.columns and '数量' in df.columns: return df except: wb = openpyxl.load_workbook(file_path) for sheet in wb: for row in sheet.iter_rows(): for cell in row: if isinstance(cell.value, str) and any(fruit in cell.value for fruit in FRUIT_LIST): return parse_custom_format(sheet)2.2 智能数据清洗
不同门店的数据往往存在各种问题:
- 单位不统一(有的用"斤",有的用"kg")
- 名称不规范("红富士" vs "富士苹果")
- 空白或错误数据
我们建立了标准化处理流程:
- 单位统一转换为千克
- 水果名称映射到标准品类
- 异常值自动标记待核查
提示:建议在config.py中维护一个水果名称映射表,后续新增品类只需修改这个文件
3. 完整实现步骤
3.1 环境准备
推荐使用Python 3.8+版本,主要依赖库:
- pandas 1.3+
- openpyxl 3.0+
- xlrd 2.0+(用于兼容老版xls格式)
安装命令:
pip install pandas openpyxl xlrd --upgrade3.2 核心代码解析
主程序逻辑分为四个模块:
- 文件遍历模块
def scan_folder(folder_path): valid_files = [] for file in os.listdir(folder_path): if file.endswith(('.xls', '.xlsx')): valid_files.append(os.path.join(folder_path, file)) return valid_files- 数据提取模块
def extract_fruit_data(file): # 实现上文提到的智能识别逻辑 ...- 数据聚合模块
def aggregate_data(data_list): total_df = pd.concat(data_list) summary = total_df.groupby('标准品类')['数量'].sum() return summary.sort_values(ascending=False)- 结果输出模块
def save_report(result_df, output_path): with pd.ExcelWriter(output_path) as writer: result_df.to_excel(writer, sheet_name='汇总') # 自动添加数据透视表 ...3.3 使用示例
将脚本保存为fruit_summary.py后:
python fruit_summary.py -i ./input_files -o ./output/report.xlsx参数说明:
- -i 指定输入文件夹路径
- -o 指定输出文件路径
4. 实战技巧与避坑指南
4.1 性能优化
处理大量文件时需要注意:
- 使用
glob替代os.listdir提高文件搜索效率 - 对于超大型Excel(>50MB),改用
chunksize分块读取 - 启用多线程处理(建议用concurrent.futures)
from concurrent.futures import ThreadPoolExecutor def batch_process(files): with ThreadPoolExecutor(max_workers=4) as executor: results = list(executor.map(process_single_file, files)) return results4.2 常见问题排查
- 编码问题:
- 遇到中文乱码时,在read_excel中添加
encoding='gbk'参数 - 特殊字符处理可以使用
errors='ignore'选项
- 格式异常:
- 合并单元格会导致pandas读取错位,需要先预处理
- 遇到加密文件时,提示用户手动处理
- 内存不足:
- 对于超多文件(>100个),建议分批处理
- 使用
del及时释放不再使用的DataFrame
5. 扩展应用场景
这个脚本经过简单修改还可以用于:
- 连锁餐厅的食材库存统计
- 超市日用品销售分析
- 电商平台商品数据汇总
进阶改进方向:
- 增加自动邮件发送功能
- 集成到钉钉/企业微信机器人
- 开发可视化看板
我在实际使用中发现,最耗时的其实不是编码过程,而是前期与各部门确认数据标准的时间。建议在正式使用前,先拿3-5个典型文件做充分测试,确保识别规则覆盖所有特殊情况。