按sheet順序合併有多個sheet的多個excel文件

按順序合併有多個sheet的多個excel文件。

在業務中,遇到要合併一個文件夾下多個包含同名、同順序sheet的xlsx文件,通過python3,參考(copy大部分)代碼:

https://www.cnblogs.com/zlhuan/p/8011304.html

除此之外,還有pandas方法的,以後再繼續學習實現。

實現說明:

  • 所有xlsx文件放在一個文件夾下,沒有其他文件。
  • python包自行補充。
  • 輸入文件名的時候,可以不輸入後綴。
  • 已經制作了一個windows下可以運行的exe文件,可提供下載
#%%
#導入包
import xlrd
import xlsxwriter
import os
import tkinter as tk
from tkinter import filedialog
#import datetime

#%%
#打開excel文件
def open_xls(file):
     try:
         fh=xlrd.open_workbook(file)
         return fh
     except Exception as e:
         print("打開文件錯誤:"+e)

#獲取excel中的值
def get_file_value(filename,sheetnum):
     #構建值list
     rvalue=[]
     #打開excel文件
     fh=open_xls(filename)
     #獲取sheet的值
     sheet=fh.sheets()[sheetnum]
     #獲取sheet的行數
     row_num=sheet.nrows
     #循環行的範圍
     for rownum in range(0,row_num):
         #獲取當前行的數據
         #獲取某一行的值sheet.row_values(rownum)
         rvalue.append(sheet.row_values(rownum))
     return rvalue
 
#選擇目標數據所在的文件夾
#all_excel_folder = r'C:\Users\Administrator\Desktop\樣例數據' #數據文件夾所在路徑
all_excel_folder = filedialog.askdirectory()

#選擇文件存放位置及文件名稱。自動補全文件後綴
#end_xls = all_excel_folder + '//' + str(datetime.datetime.now()) + '.xlsx' #輸入目標文件名
end_xls = filedialog.asksaveasfilename() + '.xlsx'
#%%
#列出當前路徑下的所有文件名稱
FileNames = os.listdir(all_excel_folder) 

#切換當前工作路徑
os.chdir(all_excel_folder) 

#循環文件名,並構建一個sheet名稱列表以備使用
for excel_name in FileNames:
    #打開excel文件
    file_fh = open_xls(excel_name)
    #獲取sheets列表
    sheet = file_fh.sheets()
    #查看列表長度(個數)
    sheet_count = len(sheet)
    #建立sheet名稱列表
    sheet_name=[]
    #獲取所有sheet名稱到列表
    for sheetname in sheet:
        sheet_name.append(sheetname.name)

#打開一個xlsx文件,準備進行寫入
endxls = xlsxwriter.Workbook(end_xls)

#用於存儲所有sheet中的值
all_sheet_value=[]

#循環所有sheet
for sheet_num in range(0,sheet_count):
    #按照sheet及文件數量構建一個列表
    all_sheet_value.append([])

    #循環文件名
    for file_name in FileNames:
        print("正在讀取"+file_name+"的第"+str(sheet_num+1)+"個標籤...")
        #獲取每個sheet的每一行的值
        file_value = get_file_value(file_name,sheet_num)
        #將每一行的值存儲到對應列表
        all_sheet_value[sheet_num].append(file_value)
        #all_sheet_value.append(file_value)

print('所有文件已讀取完畢!')

num=-1
sheet_index=-1
#%%
#將列表all_sheet_value的內容寫入目標excel
#循環每個sheet
for sheet_values in all_sheet_value:
    sheet_index = 1 + sheet_index
    #按照原有的sheetname建立一個sheet
    end_xls_sheet = endxls.add_worksheet(sheet_name[sheet_index])
    
    num+=1
    
    row_num=-1
    #循環每個文件
    for sheet1 in sheet_values:
        #循環每個行
        for row in sheet1:
            row_num+=1
            col_num=-1
            #循環每列
            for col in row:
                num2+=1
                end_xls_sheet.write(row_num,col_num,sheet3)

endxls.close()

print('已完成,運行結束!')

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