如果你覺得對你有用,留下一個贊再走,不過分吧!!謝謝!!
一、老闆的需求總是莫名奇妙
- 老闆需求:
一天老闆說,嘿!放牛娃,將這些excel表合併到一個總表裏,下班前交給我
老闆話剛講完,我心裏就想,這還不簡單麼,excel不就是有合併表的功能麼!!簡單的要死!哈哈哈哈哈哈
可當我拿到excel表後,自己傻眼了,上千個,一兩三個在excel裏還行,這麼多咋搞?????不信看下圖
- 搬救兵:
頓時我就慌了,這麼多我真沒有在Excel裏合併過,我就找了同事,同事說這還不簡單,就在Excel裏面寫腳本呀!!,我暗暗的說,我不會,然後他甩了一句話給我,你不會你活該,誰叫你不學呀,你不會百度呀!!反正領導不是讓我做,氣死你
雖然我知道我的同事性格就是這樣,但是我在那刻我還是很想打他,真想打他一頓,但是最後我只說了一句,我就不用Excel,我也能夠搞定,你有什麼可豪橫的
二、別人不幫你,你幫你自己
- 有事找度娘:
首先,我在網上,csdn找了相關的文章,大多都是魚龍混雜,可能作者自己會,但是分享給人,別人卻看不懂,完全按照作者的來操作,卻得不出結果,失敗告終 - 程序員就拿出自己的本領
尋找無果後,我決定自己寫一個python程序,將思路捋了一波後,就開始着手寫了
三、上乾貨,看不懂,我買飛機票給你
- 思路分析一波:
"""
思路分析:
1. 創建一個空表名叫"總表",表格形式須和合並表的一樣
2. 獲取需要合併文件夾中的所有excel表的名字(文件名)
3. 開始遍歷excel表
4. 先讀取數據,然後寫入事先創建好總表中
5. 當讀取完下一個待合併表的數據,然後準備寫入到總表時,必須先獲取到總表的行數,不然之前的數據將會被覆蓋掉。
6. 遍歷結束,保存總表的數據
"""
- 所需技能包
- 會用python對excel表的讀操作
- 會用python對excel表的寫操作
如果上述說的不會,咋辦??沒事!!我幫你找出來了
- 相關技能包文章:
1)python操作Excel表讓你體驗光速便捷—讀操作
- python操作Excel表讓你體驗光速便捷—寫操作
- python操作Excel表讓你體驗光速便捷—寫操作之xlutils庫(推薦使用)
- 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(加時請備註:學習資料))
-
Java web從入門到精通電子書
-
Python機器學習電子書
-
Python400集(北京尚學堂)
-
JavaScript項目案例、經典面試題
-
Java300集(入門、精通)
-
Java後端培訓機構錄集(同事培訓內部提供)
-
java重要知識pdf文檔(價值連城呀呀,不收藏你會後悔的)
喜歡就關注吧,點個贊吧