按順序合併有多個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('已完成,運行結束!')