使用Python合并Excel文件

需求

工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,就可以找Python来帮忙了。

合并需求很多,常见的有:

  • 相同数据结构,按行进行纵向拼接。
  • 合并多个Excel中的Sheet(工作表),形成多Sheet文件。

环境准备

使用Python操作Excel文件,有很多的类库可以选择,这里我选择使用xlwings。xlwings功能强大,可读写各种类型的Excel文件,但有个小限制,运行环境中须已安装Excel。

安装很简单,命令行:

pip install xlwings

数据准备

创建3个Excel订单数据,如下图:


Excel文件截图.png

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


Excel数据截图.png

基础定义

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!

你可能感兴趣的:(使用Python合并Excel文件)