- 其实合并同一目录下的多个Excel文件,理论上用VBA是最好的,因为可以在复制粘贴的时候连格式一起,用python不好的地方就在于要把格式一起复制过去是很困难的。
- 当然如果对格式没什么太高的要求,那么使用xlwings合并Excel就绝对是一个很好的选择了
- 以下是实现代码,考虑到了excel内有多个sheet和标题行只需要复制一次的情况。
- import xlwings as xw
- import os
- # 以上是导入两个必要的库,xlwings用来操作excel,os用来遍历文件夹
- # 代码能运行的大前提是所有的excel的sheet数量是相同的,且每个sheet的字段都是相同的
- app = xw.App(visible=False,add_book=False)
- # 打开Excel,如果visible用false,则只在后台运行,add_book用false,不会新建一个空白的工作簿
- # 先要遍历文件夹
- path = r'd:\1' # 定义路径,OS提供了两种遍历文件夹的办法
- # 例子中,文件夹1内有excel文件若干和一个子文件夹
- # files1 = os.listdir(path)
- # # 这是第一种,会遍历路径下所有文件包括子文件夹,结果以列表给出,但仅仅能给出文件名/子文件名,无法对二者进行区分
- # # for file in files1:
- # # print(os.path.join(path,file))
- files2 = os.walk(path)
- # 这是第二种,通过walk函数,返回root(路径),dirs(子目录),files(文件名)三个元组,本例中我们用walk来遍历
- def summary():
- for root , dirs , files in os.walk(path):
- for f in range(len(files)): # 遍历文件夹的设定到此结束,下面要开始使用xlwings进行调用
- wb = app.books.open(os.path.join(root,list(files)[f])) # 打开excel工作表
- sheet_count = wb.sheets.count # 查看wb里面一共有多少sheets,为遍历wb里的sheets做准备
- if f == 0: # 考虑到标题行,直接将第一个打开的工作簿另存为新工作簿
- wb.save(path + '\\' + 'new.xlsx') # 将第一个打开的wb另存为一个新的工作簿new.xlsx用于汇总
- wb.close() # 关闭wb
- else: # 当第二个工作簿打开的时候
- newwb = app.books.open(path + '\\' + 'new.xlsx') # 先把新建的汇总工作簿打开
- for s in range(sheet_count): # 开始遍历sheets
- sht = wb.sheets[s]
- nrow = sht.used_range.last_cell.row # 定义源工作簿中最后一行
- ncol = sht.used_range.last_cell.column # 定义源工作簿中最后一列
- newrow = newwb.sheets[s].range('A65536').end('up').row # 定义目标工作簿中最后一行
- newwb.sheets[s].range('A'+str(newrow+1)).value = sht.range((2,1),(nrow,ncol)).value
- # 将“源工作簿”中要复制的内容赋值给“目标工作簿”
- newwb.save(path + '\\' + 'new.xlsx') # sheets遍历结束后,保存源工作簿
- wb.close()
- # newwb.close() # 将打开的工作簿关闭,进入下一个循环
- app.quit() # 退出Excel
- summary()