python一鍵合併上千個Excel表(對不起!!因爲這事,我和同事吵了一架)

如果你覺得對你有用,留下一個贊再走,不過分吧!!謝謝!!

一、老闆的需求總是莫名奇妙

  • 老闆需求:
       一天老闆說,嘿!放牛娃,將這些excel表合併到一個總表裏,下班前交給我
       老闆話剛講完,我心裏就想,這還不簡單麼,excel不就是有合併表的功能麼!!簡單的要死!哈哈哈哈哈哈
       可當我拿到excel表後,自己傻眼了,上千個,一兩三個在excel裏還行,這麼多咋搞?????不信看下圖
    在這裏插入圖片描述在這裏插入圖片描述
  • 搬救兵:
       頓時我就慌了,這麼多我真沒有在Excel裏合併過,我就找了同事,同事說這還不簡單,就在Excel裏面寫腳本呀!!,我暗暗的說,我不會,然後他甩了一句話給我,你不會你活該,誰叫你不學呀,你不會百度呀!!反正領導不是讓我做,氣死你
       雖然我知道我的同事性格就是這樣,但是我在那刻我還是很想打他,真想打他一頓,但是最後我只說了一句,我就不用Excel,我也能夠搞定,你有什麼可豪橫的

二、別人不幫你,你幫你自己

  • 有事找度娘:
       首先,我在網上csdn找了相關的文章,大多都是魚龍混雜,可能作者自己會,但是分享給人,別人卻看不懂,完全按照作者的來操作,卻得不出結果,失敗告終
  • 程序員就拿出自己的本領
       尋找無果後,我決定自己寫一個python程序,將思路捋了一波後,就開始着手寫了

三、上乾貨,看不懂,我買飛機票給你

  • 思路分析一波:
"""
思路分析:
    1. 創建一個空表名叫"總表",表格形式須和合並表的一樣
    2. 獲取需要合併文件夾中的所有excel表的名字(文件名)
    3. 開始遍歷excel表
    4. 先讀取數據,然後寫入事先創建好總表中
    5. 當讀取完下一個待合併表的數據,然後準備寫入到總表時,必須先獲取到總表的行數,不然之前的數據將會被覆蓋掉。
    6. 遍歷結束,保存總表的數據
"""
  • 所需技能包
  • 會用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)

看到這,都不留個贊說不過去了吧吧!!!!

運行結果:
在這裏插入圖片描述
在這裏插入圖片描述

五、不是程序員,也別慌

   爲了顧及非程序也能夠運行這個程序,我將它打包成一個自動合併工具,即.exe程序,看圖!!

在這裏插入圖片描述
   只要按照說明書那樣操作,那就完事了(非常簡單,雙擊運行即可),看到這,再不點個贊,我可要打人了哈!!!!!!!!
   如果需要這個工具,可以關注我的公衆號,後臺回覆“自動合併工具”提取。

   敲重點: 有問題可以留言交流呀!!!!,也可以分享你的解決方案!!!

六、分享交流

最後有興趣一起交流的,可以關注我的公衆號:這裏你能夠學到很實用的技巧,不是常用的我不說,公衆號回覆提取碼即可獲取以下學習資料啦啦啦啦,喜歡就拿去吧!!

(鏈接時常會失效,若出現此類情況,可以加我微信:17722328325(加時請備註:學習資料))

  1. Java web從入門到精通電子書

  2. Python機器學習電子書

  3. Python400集(北京尚學堂)

  4. JavaScript項目案例、經典面試題

  5. Java300集(入門、精通)

  6. Java後端培訓機構錄集(同事培訓內部提供)

  7. java重要知識pdf文檔(價值連城呀呀,不收藏你會後悔的)



        喜歡就關注吧,點個贊吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章