共计 3962 个字符,预计需要花费 10 分钟才能阅读完成。
导读 | 大家好,我是崔艳飞。前两天给大家分享了 Python 自动化文章:手把手教你利用 Python 轻松拆分 Excel 为多个 CSV 文件,而后在 Python 进阶交流群里边有读者遇到一个问题,他有很多个 Excel 表格,他需要对这些 Excel 文件进行合并。 |
大家好,我是崔艳飞。前两天给大家分享了 Python 自动化文章:手把手教你利用 Python 轻松拆分 Excel 为多个 CSV 文件,而后在 Python 进阶交流群里边有读者遇到一个问题,他有很多个 Excel 表格,他需要对这些 Excel 文件进行合并。
诚然,一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对 Python 来说,so easy,一起来看看吧!
用 Python 实现多 Excel、多 Sheet 的合并处理。
软件:PyCharm
需要的库:pandas,xlrd,os
利用 os,获取所有要合并的 Excel 文件。
利用 xlrd 库进行 Excel 读取,获取要合并的 Sheet 名。
利用 pandas 库,对所有 Sheet 名逐一循环打开,通过 concat() 进行数据追加合并即可。
利用 to_excel 保存数据,得到最终合并后的目标文件。
import pandas as pd
import xlrd
import os
# 要合并文件路径
path=”D:/b/”
#获取文件夹下所有 EXCEL 名
xlsx_names = [x for x in os.listdir(path) if x.endswith(“.xlsx”)]
# 获取第一个 EXCEL 名
xlsx_names1 = xlsx_names[0]
aa = path + xlsx_names1
#打开第一个 EXCEL
first_file_fh=xlrd.open_workbook(aa)
# 获取 SHEET 名
first_file_sheet=first_file_fh.sheets()
# 按 SHEET 名循环
for sheet_name in sheet_names:
df = None
# 按 EXCEL 名循环
for xlsx_name in xlsx_names:
sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names
if sheet_name in sheet_na:
#print(sheet_name)
_df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None)
if df is None:
df = _df
else:
df = pd.concat([df, _df], ignore_index=True)
else:continue
df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False)
print(sheet_name + "保存成功!共 %d 个,第 %d 个。" % (len(sheet_names),num))
num += 1
writer.save()
writer.close()
1、处理前 Excel 数据:
2、运行进度提示:
3、合并后的结果:
本文介绍了如何利用 Python 对多个 Excel 文件、多 Sheet 进行合并处理,减少了很多复制粘贴的麻烦,省时省力,还不容易出错,代码不多,循环追加有点绕,想想也就明白了,不懂的随时留言提问,大家一起学习进步。
有想法的小伙伴还可以将文章中的代码进行打包,做成一个 exe 可执行的小软件,包装好发给别人使用,也可以赚点小费噢,关于打包的教程这里不再赘述,欢迎前往:三个你必须要记住的 Pyinstaller 打包命令——利用 Python 实现打包 exe。
下面两份代码是群内小伙伴提供了,小编也自行测试了下,亲测有效,欢迎大家积极尝试噢!
来自群友 Jayson 的代码:
# -*- coding: utf-8 -*-
# @Author: hebe
# @Date: 2020-04-18 18:31:03
# @Last Modified by: hebe
# @Last Modified time: 2020-04-18 19:40:48
import os
import glob
import openpyxl
def merge_xlsx_files(xlsx_files):
wb = openpyxl.load_workbook(xlsx_files[0])
ws = wb.active
ws.title = "merged result"
for filename in xlsx_files[1:]:
workbook = openpyxl.load_workbook(filename)
sheet = workbook.active
for row in sheet.iter_rows(min_row=1):
values = [cell.value for cell in row]
ws.append(values)
return wb
#path is very important here , must true.
def get_all_xlsx_files(path):
xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx'))
sorted(xlsx_files, key=str.lower)
return xlsx_files
def main():
xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx'))
wb = merge_xlsx_files(xlsx_files)
wb.save('merged_form.xlsx')
if __name__ == '__main__':
main()
print("all excel append OK!")
来自好友刘早起的代码:
# -*- coding: utf-8 -*-
from openpyxl import load_workbook, Workbook
import glob
path = "C:\\Users\\pdcfi\\Desktop\\excel\\"
new_workbook = Workbook()
new_sheet = new_workbook.active
# 用 flag 变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加
flag = 0
for file in glob.glob(path + '/*.xlsx'):
workbook = load_workbook(file)
sheet = workbook.active
coloum_A = sheet['A']
row_lst = []
for cell in coloum_A:
if cell:
print(cell.row)
row_lst.append(cell.row)
if not flag:
header = sheet[1]
header_lst = []
for cell in header:
header_lst.append(cell.value)
new_sheet.append(header_lst)
flag = 1
for row in row_lst:
data_lst = []
for cell in sheet[row]:
data_lst.append(cell.value)
new_sheet.append(data_lst)
new_workbook.save(path + '/' + '符合筛选条件的新表.xlsx')
来自群友 Engineer 的代码:import tkinter as tk
from tkinter import filedialog
import os
import pandas as pd
import glob
root = tk.Tk()
root.withdraw()
# 选择文件夹位置
filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))
lst = []
# 读取文件夹下所有文件(xls 和 xlsx 都读取)for i in glob.glob(filelocation + "\\\\" + "*.*"):
if os.path.splitext(i)[1] in [".xls", ".xlsx"]:
lst.append(pd.read_excel(i))
# 保存合并后的 excel 文件
writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="保存", initialdir=filelocation, defaultextension="xlsx",
filetypes=[("Excel 工作簿", "*.xlsx"),
("Excel 97-2003 工作簿", "*.xls")]))
pd.concat(lst).to_excel(writer, 'all', index=False)
writer.save()
print('\n%d 个文件已经合并成功!' % len(lst))
当然了,实现本文功能不仅仅限于上面提及的 3 种方式,使用 pandas 也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流!