需求
工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,就可以找Python来帮忙了。
合并需求很多,常见的有:
- 相同数据结构,按行进行纵向拼接。
- 合并多个Excel中的Sheet(工作表),形成多Sheet文件。
环境准备
使用Python操作Excel文件,有很多的类库可以选择,这里我选择使用xlwings。xlwings功能强大,可读写各种类型的Excel文件,但有个小限制,运行环境中须已安装Excel。
安装很简单,命令行:
pip install xlwings
数据准备
创建3个Excel订单数据,如下图:

每个文件有一个Sheet,数据结构相同,如下图:

基础定义
import xlwings as xw
import os
import glob
# 数据文件目录
src_dir = 'c:\\testdata\\订单文件'
# 指定新文件
new_file = 'c:\\testdata\\订单文件汇总\\汇总文件.xlsx'
# 搜索后缀为'xlsx'的文件
files = glob.glob('*.xlsx', root_dir=src_dir)
# 或者扩展到搜索子目录
files = glob.glob('**\\*.xlsx', root_dir=src_dir, recursive=True)
print(files)
['2022-01.xlsx', '2022-02.xlsx', '2022-03.xlsx']
合并数据
# 删除已有的新文件
if os.path.exists(new_file):
os.remove(new_file)
# 创建汇总Excel文件
app = xw.App(visible=False)
wb = app.books.add()
sheet = wb.sheets[0]
# 循环复制每个文件的数据
## 记录已复制行数
row_num = 0
## 标题行数,通常为1,只复制第一个文件的标题,如果没有,改为0
title_line_num = 1
for file in files:
bk = app.books.open(os.path.join(src_dir, file))
st = bk.sheets[0]
rng = st.used_range
start = 0
if row_num:
start = title_line_num
sheet.range(row_num+1,1).value = rng.value[start:]
row_num = row_num + rng.rows.count - start
bk.close()
wb.save(new_file)
wb.close()
app.quit()
print('Done!')
Done!
合并Sheet
# 删除已有的新文件
if os.path.exists(new_file):
os.remove(new_file)
# 创建汇总Excel文件
app = xw.App(visible=False)
wb = app.books.add()
sheet = wb.sheets[0]
for idx, file in enumerate(files):
bk = app.books.open(os.path.join(src_dir, file))
st = bk.sheets[0]
# 采用复制方式,除了数据,格式、sheet名称都复制,名称冲突也完美解决
sheet = st.copy(after=sheet)
bk.close()
# 删除自动创建的sheet
wb.sheets[0].delete()
wb.save(new_file)
wb.close()
app.quit()
print('Done!')
Done!
网友评论