Py学习  »  Python

python一键合并上千个Excel表(对不起!!因为这事,我和同事吵了一架)

逆风飞翔-111 • 3 年前 • 226 次点击  

如果你觉得对你有用,留下一个赞再走,不过分吧!!谢谢!!

一、老板的需求总是莫名奇妙

  • 老板需求:
    一天老板说,嘿!放牛娃,将这些excel表合并到一个总表里,下班前交给我
    老板话刚讲完,我心里就想,这还不简单么,excel不就是有合并表的功能么!! 简单的要死 !哈哈哈哈哈哈
    可当我拿到excel表后,自己傻眼了,上千个,一两三个在excel里还行,这么多咋搞?????不信看下图
    在这里插入图片描述 在这里插入图片描述
  • 搬救兵:
    顿时我就慌了,这么多我真没有在Excel里合并过,我就找了同事, 同事说这还不简单,就在Excel里面写脚本呀!! ,我暗暗的说,我不会,然后他甩了一句话给我, 你不会你活该,谁叫你不学呀,你不会百度呀!!反正领导不是让我做,气死你
    虽然我知道我的同事性格就是这样,但是我在那刻我还是很想打他,真想打他一顿,但是最后 我只说了一句,我就不用Excel,我也能够搞定,你有什么可豪横的

二、别人不帮你,你帮你自己

  • 有事找度娘:
    首先,我在 网上 csdn 找了相关的文章,大多都是 鱼龙混杂 ,可能作者自己会,但是分享给人,别人却看不懂,完全按照作者的来操作,却得不出结果, 失败告终
  • 程序员就拿出自己的本领
    寻找无果后,我决定自己写一个python程序,将思路捋了一波后,就开始着手写了

三、上干货,看不懂,我买飞机票给你

  • 思路分析一波:
"""
思路分析:
    1. 创建一个空表名叫"总表",表格形式须和合并表的一样
    2. 获取需要合并文件夹中的所有excel表的名字(文件名)
    3. 开始遍历excel表
    4. 先读取数据,然后写入事先创建好总表中
    5. 当读取完下一个待合并表的数据,然后准备写入到总表时,必须先获取到总表的行数,不然之前的数据将会被覆盖掉。
    6. 遍历结束,保存总表的数据
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 所需技能包
  • 会用python对excel表的读操作
  • 会用python对excel表的写操作

如果上述说的不会,咋办??没事!! 我帮你找出来了

  1. python操作Excel表让你体验光速便捷—写操作
  2. python操作Excel表让你体验光速便捷—写操作之xlutils库(推荐使用)
  3. python操作Excel表让你体验光速便捷—读写操作之pandas库(神来之笔,带你飞,全套)

四、上代码:(每一步都有注释,完全不用担心,全网最良心)

完整代码:

import os
import xlwt
import xlrd
import xlutils.copy
import time
"""
公司老板需求:

    1. 将上千个Excel表合并成一个表里
    2. 不管你用什么方法,实现效果就行
"""
# #################################### 代码走起来呀!!!
"""
思路分析:
    1. 创建一个空表名叫"总表",表格形式须和合并表的一样
    2. 获取需要合并文件夹中的所有excel表的名字(文件名)
    3. 开始遍历excel表
    4. 先读取数据,然后写入事先创建好总表中
    5. 当读取完下一个待合并表的数据,然后准备写入到总表时,必须先获取到总表的行数,不然之前的数据将会被覆盖掉。
    6. 遍历结束,保存总表的数据
"""
"""
项目运行:
    1. 将所有需要合并的表放到一个文件夹中,名叫excels
    2. autoMerge.py文件和excels文件夹同级
    3. 运行该.py文件,会在把合并表放到destDir夹中
"""

# 1.总表初始化(不友好,还需要自行写好表头列表,对非程序员不友好)
def initExcel(path,excelTitle,excel_sheet_Name):
    """
    :param path: 合并总表的路径
    :param excelTitle: 总表的表头
    :param excel_sheet_Name: 合并总表的sheet名称
    :return: 返回总表是否初始化成功
    """
    try:
        # 创建一个工作簿
        book = xlwt.Workbook(encoding="utf-8")
        # 创建表单
        sheet = book.add_sheet(excel_sheet_Name)
        # 写入表头
        for i in range(0,len(excelTitle)):
            sheet.write(0, i, excelTitle[i])
        book.save(path)
        return True
    except Exception as e:
        return False

# 1.1 总表初始化(用来解决上面的问题)
def initExcel2(destExcel_path, sourceExcel_path,total_sheet_name):
    """

    :param destExcel_path: 合并总表excel的路径
    :param sourceExcel_path: 需要合并excel的路径
    :param total_sheet_name: 合并总表后sheet的名字
    :return: 返回False or True
    """
    try:
        # 创建一个工作簿
        book =


    
 xlwt.Workbook(encoding="utf-8")
        # 创建表单,并给表单起个名字
        sheet = book.add_sheet(total_sheet_name)
        # 获取待需合并excel的所有文件
        excel_name_list = get_All_Excelname(sourceExcel_path)
        # 一个待合并execl的路径
        excel_path = sourceExcel_path + "/" + excel_name_list[0]
        # 获取excel的sheet
        excel_sheet = get_excel_sheet(excel_path)
        # 获取excel的表头数据
        excel_title_list = excel_sheet.row_values(0)
        # 写入表头
        for i in range(0,len(excel_title_list)):
            sheet.write(0, i, excel_title_list[i])
        book.save(destExcel_path)
        return True
    except Exception as e:
        return False





# 2.获取需要合并的所有的excel文件名
def get_All_Excelname(path):
    """

    :param path: 待合并excel文件的路径
    :return:
    """
    excelName_list = os.listdir(path)
    # print(excelName_list)
    return excelName_list


# 返回excel表的sheet对象
def get_excel_sheet(path):
    # 打开指定路径的excle表
    book = xlrd.open_workbook(path)
    # 获取excle中的表单
    sheet = book.sheet_by_index(0)
    # 返回sheet对象
    return sheet

# 返回总表的wtbook,sheet对象
def get_total_excel_sheet(path):
    """

    :param path: 存放总表的path
    :return:
    """
    book = xlrd.open_workbook(path, formatting_info=True)
    wtbook = xlutils.copy.copy(book)
    wtsheet = wtbook.get_sheet(0)
    return wtbook,wtsheet



# 4. 开始遍历(合并excel表)
def writeExcel(destExcel_path,source_path,excelName_list):
    """

    :param destExcel_path: 合并总表存放的路径
    :param source_path: 需要合并excel的路径
    :param excelName_list: 需要合并excel表的文件名称
    :return:
    """
    # 用来记录总表中的行数
    total_excel_row = 1
    # 获取总表的book,sheet
    total_book,total_sheet = get_total_excel_sheet(destExcel_path)
    for excelName in excelName_list:
        # 文件路径
        excelPath = source_path + excelName
        # 获取表的sheet对象
        sheet = get_excel_sheet(excelPath)
        # 获取行数
        n_rows = sheet.nrows
        # 开始遍历读取数据,并写入数据
        for row_index in range(1,n_rows):
            # 获取一行的数据,列表形式
            row_data_list = sheet.row_values(row_index)
            # 将数据写入到总表中
            for j in range(0,len(row_data_list)):
                total_sheet.write(total_excel_row,j,str(row_data_list[j]))
            # 每写一行,总表行数加1
            total_excel_row = total_excel_row + 1
    total_book.save(destExcel_path)
    print("数据合并已完成")
    print("合并后的数据共有%d条" % (total_excel_row - 1


    
))

# 创建文件夹
def makeDir(path):
    """
    :param path: 传入需要创建文件夹的路径
    :return:
    """
    if not os.path.exists(path):
        os.mkdir(path)



def main():
    # 待需合并的excel文件夹路径
    source_excel_path = "./excels/"
    # 存放合并后的excel表文件夹路径
    dest_dir = "./destDir"
    # 创建文件夹
    makeDir(dest_dir)
    # 合并excel表名
    total_excel_name = "总表.xls"
    # 合并表存放路径
    total_excel_path = dest_dir + "/" + total_excel_name
    # 合并总表中的sheet的名字
    total_excel_sheet_name = "汇总表"
    # 初始化表
    flag = initExcel2(total_excel_path,source_excel_path,total_excel_sheet_name)
    if flag:
        excelName_list = get_All_Excelname("./excels")
        # 打印有多少个excel表
        print("总共有%d个excel表需要合并" %len(excelName_list))
        # 写数据
        writeExcel(total_excel_path,source_excel_path, excelName_list)
    else:
        print("初始化表失败")


if __name__ == '__main__':
    main()
    time.sleep(3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190

看到这,都不留个赞说不过去了吧吧!!!!

运行结果:
在这里插入图片描述
在这里插入图片描述

五、不是程序员,也别慌

为了顾及非程序也能够运行这个程序,我将它打包成一个自动合并工具,即.exe程序,看图!!

在这里插入图片描述
只要按照说明书那样操作,那就完事了(非常简单,双击运行即可) ,看到这,再不点个赞,我可要打人了哈!!!!!!!!
如果需要这个工具,可以关注我的公众号,后台回复“ 自动合并工具 ”提取。

敲重点: 有问题可以留言交流呀!!!!,也可以分享你的解决方案!!!

六、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧, 不是常用的我不说 ,公众号回复 提取码 即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

  7. java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)



喜欢就关注吧,点个赞吧
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71053
 
226 次点击