手把手教你4种方法用Python批量实现多Excel多Sheet合并

Karen110
• 阅读 2021

一、前言

大家好,我是崔艳飞。前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。

手把手教你4种方法用Python批量实现多Excel多Sheet合并

诚然,一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对Python来说,so easy,一起来看看吧!

二、项目目标

用Python实现多Excel、多Sheet的合并处理。

三、项目准备

软件:PyCharm

需要的库:pandas, xlrd,os

四、项目分析

1)如何选择要合并的Excel文件?

利用os,获取所有要合并的Excel文件。

2)如何选择要合并的Sheet?

利用xlrd库进行Excel读取,获取要合并的Sheet名。

3)如何合并?

利用pandas库,对所有Sheet名逐一循环打开,通过concat()进行数据追加合并即可。

4)如何保存文件?

利用to_excel保存数据,得到最终合并后的目标文件。

五、项目实现

1、第一步导入需要的库

import pandas as pd
import xlrd
import os

2、第二步选择要合并的Excel文件

#要合并文件路径
    path="D:/b/"
    #获取文件夹下所有EXCEL名
    xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]

3、第三步选择要合并的Sheet

  # 获取第一个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()

4、第四步对Sheet内容进行循环合并

#按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

5、第五步保存合并后的文件

   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数据:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

2、运行进度提示:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

3、合并后的结果:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

七、总结

本文介绍了如何利用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))

最后需要本文项目代码的小伙伴,请在公众号后台回复“合并文件”关键字进行获取,如果在运行过程中有遇到任何问题,请随时留言或者加小编好友,小编看到会帮助大家解决bug噢!

当然了,实现本文功能不仅仅限于上面提及的3种方式,使用pandas也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流。

小编最近建立了一个Python付费学习交流群,只需要9.99元小红包即可入群学习交流,大家的学习氛围很好,有问必答,里边“无丝竹乱耳,亦无案牍劳形”,纯交流学习之用,感兴趣的小伙伴可以加下方小编微信进群学习交流噢!

手把手教你4种方法用Python批量实现多Excel多Sheet合并

**-----**------**-----**---**** End **-----**--------**-----**-****

手把手教你4种方法用Python批量实现多Excel多Sheet合并

往期精彩文章推荐:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/lxj2a1meuZ6mxlC8GKEGWg,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Python进阶者 Python进阶者
2年前
盘点CSV文件在Excel中打开后乱码问题的两种处理方法
大家好,我是Python进阶者。前几天给大家分享了一些乱码问题的文章,阅读量还不错,感兴趣的小伙伴可以前往:,,今天基于粉丝提问,给大家介绍CSV文件在Excel中打开后乱码问题的两种处理方法,希望对大家的学习有所帮助。前言前几天有个叫【RSL】的粉丝在Python交流群里问了一道关于CSV文件在Excel中打开后乱码的问题,如下图所示。在Excel中直接
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Python进阶者 Python进阶者
8个月前
盘点一个Python自动化办公Excel数据处理的需求
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【干锅牛蛙】问了一个Python处理Excel数据的问题。问题如下:有两个问题哈:1、表头有合并单元格识别不出来,如何处理类似下图2、遇到单元格有公式自动识别成了0,如何处理,保留计算后
Python进阶者 Python进阶者
7个月前
读取设置密码保护的excel文件,有没有更好的办法?
大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【wen】问了一个Python处理Excel加密文件读取问题。问题如下:请教:读取设置了密码保护的exlce文件,dfpd.readexcel(file,password'12345
Python进阶者 Python进阶者
6个月前
有遇到过吗?同样的规则 Excel 中 比Python 结果大
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【JethroShen】问了一个Python处理Excel数据读取的问题。问题如下:有遇到过吗?同样的规则Excel中比Python结果大?二、实现过程这里【瑜亮老师】和【论草莓如何成为