工作中遇到需要合并多个sheet表的逐月数据的excel文件。即对多月数据,依据sheet表进行合并,最终形成年度数据。(该方法不要求文件名有规律,也不要求sheet表名称有规律)
如:文件结构
以下为处理方法:
1. 首先自动获取所有的sheet名:
# 导入所需包
import pandas as pd
import glob
## 用于循环目录文件
# 先读取一个excel文件,获取其全部的sheet名
df = pd.ExcelFile('./test.xlsx')
print(df.sheet_names)
## 结果
## ['Sheet1', 'Sheet2', 'Sheet3']
2. 合并处理:
对每个sheet名,循环遍历所有excel文件,读取该sheet表内容,进行合并。并将合并后的结果,写进 concat_path 文件中相应的sheet里。
# 设置合并后的数据要写入的excel文件路径
concat_path = './合并后文件.xlsx'
writer = pd.ExcelWriter(concat_path)
sheet_names = df.sheet_names
# 获取 dir_path 路径下的所有 '.xlsx' 格式文件的路径
files=glob.glob(dir_path + '/*.xlsx')
print(files)
## 输出:
## ['D:\\test\\data\\test_data1.xlsx', 'D:\\test\\data\\test_data2.xlsx']
"""
对每个sheet名,循环遍历excel文件,读取该sheet表,进行合并,
并将合并后的结果,写进 concat_path 中相应的sheet里
"""
## 对每个sheet
for sheet in sheet_names:
## 创建一个空数据框,用于存储同一个sheet名对应的所有文件中的数据
test_df = pd.DataFrame()
## 对每个文件
for file in files:
with pd.ExcelFile(file) as xlsx:
## 读取该sheet表内容,header=5 表示第6行是列名,数据从第7行开始
row_df = pd.read_excel(xlsx, sheet, header=5)
if not int(row_df.size) > 0: # 判断该sheet是否空白
continue
else: # 有内容则进行合并
test_df = pd.concat([test_df, row_df], axis=0) # 按行拼接
# 写入新excel文件的相应sheet表中
test_df.to_excel(writer,sheet_name=sheet,index=False)
writer.save()
以上。