
# 使用此指令前,请确保安装必要的Python库,例如使用以下命令安装:
# pip install pandas openpyxl xlrd
import pandas as pd
import os
from datetime import datetime
from typing import *
try:
from xbot.app.logging import trace as print
except:
from xbot import print
def merge_excel_files_by_date(source_folder, output_folder):
"""
title: 按日期汇总Excel文件
description: 将指定文件夹 % source_folder % 中的所有.xls格式Excel文件汇总到一个.xlsx格式文件中,文件名为当天日期格式,并保存到 % output_folder % 文件夹。确保中文字符正确显示,无乱码问题。
inputs:
- source_folder (folder): 源文件夹路径,包含需要汇总的.xls文件,eg: "D:\孙飞\销售流水数据源\仓库库存\各门店数据源"
- output_folder (folder): 输出文件夹路径,用于保存汇总后的Excel文件,eg: "D:\孙飞\销售流水数据源\仓库库存\数据源汇总"
outputs:
- output_file_path (str): 生成的汇总文件完整路径,eg: "D:\孙飞\销售流水数据源\仓库库存\数据源汇总\2026-01-21.xlsx"
"""
# 检查输入有效性
if not os.path.exists(source_folder):
raise FileNotFoundError(f"源文件夹不存在: {source_folder}")
if not os.path.exists(output_folder):
os.makedirs(output_folder, exist_ok=True)
def _get_xls_files(folder_path):
"""获取文件夹中所有.xls文件"""
xls_files = []
for file in os.listdir(folder_path):
if file.lower().endswith('.xls'):
xls_files.append(os.path.join(folder_path, file))
return xls_files
def _read_xls_safely(file_path):
"""安全读取.xls文件,防止中文乱码"""
try:
# 使用xlrd引擎读取.xls文件
df = pd.read_excel(file_path, engine='xlrd')
return df
except Exception as e:
raise Exception(f"无法读取文件 {os.path.basename(file_path)}: {str(e)}")
def _merge_excel_data(file_list):
"""合并所有Excel文件数据"""
all_dataframes = []
for file_path in file_list:
try:
df = _read_xls_safely(file_path)
# 添加数据来源标识
df['源文件'] = os.path.basename(file_path)
all_dataframes.append(df)
print(f"成功读取: {os.path.basename(file_path)} ({len(df)} 行数据)")
except Exception as e:
print(f"跳过文件 {os.path.basename(file_path)}: {str(e)}")
continue
if not all_dataframes:
raise ValueError("没有成功读取到任何有效的Excel文件")
# 纵向合并所有数据
merged_df = pd.concat(all_dataframes, ignore_index=True, sort=False)
return merged_df
# 获取所有.xls文件
xls_files = _get_xls_files(source_folder)
if not xls_files:
raise FileNotFoundError(f"在源文件夹中未找到.xls格式的文件")
print(f"发现 {len(xls_files)} 个.xls文件待处理")
# 合并所有Excel数据
combined_data = _merge_excel_data(xls_files)
# 生成当天日期文件名
today_str = datetime.now().strftime("%Y-%m-%d")
output_filename = f"{today_str}.xlsx"
output_file_path = os.path.join(output_folder, output_filename)
# 保存为.xlsx格式,确保中文正常显示
try:
combined_data.to_excel(output_file_path, index=False, engine='openpyxl')
print(f"汇总完成!总计 {len(combined_data)} 行数据")
print(f"输出文件: {output_file_path}")
return output_file_path
except Exception as e:
raise Exception(f"保存文件时出错: {str(e)}")