應用場景1:某個文件夾中有多個Excel文件,現在需要將其合成一個Excel文件,一個工作簿中包含多個表單頁
應用場景2:某Excel文件包含多個表單頁,現在需要將其分解成多個獨立的Excel文件,每個工作簿中包含一個表單頁
pandas具有多種文件類型的輸入輸出功能,話不多說,直接上代碼:
#coding: utf-8
import os
import pandas as pd
#使用pandas庫將指定路徑文件夾中的所有Excel(*.xlsx和*.xls)文件合並為一個文件
def merge_ExcelFiles(dirPath, outputFileName='合並結果.xlsx',includeFilename=False):
dirPath+='\\'
file_list=os.listdir(dirPath)
wbo=pd.ExcelWriter(dirPath+outputFileName, engine='xlsxwriter')
sheetlist=[]#利用列表來收集已有的sheet名字
for file in file_list:
#pandas同時支持.xls和.xlsx文件
if file.endswith('.xls') or file.endswith('.xlsx'):#參數sheet_name默認為0,此時函數返回的直接就是DataFrame類型,但是那樣的話只能讀取第一個sheet,設置為None可以讀取所有的sheet,返回數據則是字典類型
print(file)
df=pd.read_excel(dirPath+file, sheet_name=None, dtype='object')#參數dtype默認是None,但為了保護數據(例如身份證號被科學計數法丟失後面幾位數字),需要使用object類型
for key, value in df.items():#
if includeFilename:
sheetname=os.path.splitext(file)[0]+'-'+key #使用"文件名+sheet_name",仍有重名風險,例如xxx.xlsx與xxx.xls中相同的sheet_name
else:
sheetname=key #直接使用原來的sheet_name,有重名的風險
namelen=len(sheetname)
#在Excel中的sheet_name最長不能超過31個字符(must be <= 31 chars),否則會出錯
if namelen>=28:#考慮冗余,如果重名了後面還要加數字
sheetname=r'...'+sheetname[namelen-25:] #截取後面的25位
#當sheet_name重名時保存會丟失數據,需要對重復sheet_name進行自增處理,最多100個重復sheet,不然sheet_name超過31個字符會出錯
sheetlist.append(sheetname)
if sheetlist.count(sheetname)>1:#說明存在重復的sheet_name
sheetname=sheetname+'-'+str(sheetlist.count(sheetname))#利用列表中元素重復的數目來對同名sheetname進行重命名
pd.DataFrame(value).to_excel(wbo, sheet_name=sheetname, index=False, header=True)
print(sheetname)
print('OK!')
wbo.save()
#使用pandas庫將指定路徑Excel(*.xlsx和*.xls)文件中的所有sheet頁文件分為獨立的Excel文件
def split_ExcelFiles(filePath):
df=pd.read_excel(filePath, sheet_name=None, dtype='object')#參數dtype默認是None,但為了保護數據(例如身份證號被科學計數法丟失後面幾位數字),需要使用object類型
for key, value in df.items():#
filename=os.path.splitext(filePath)[0]+'-'+key+os.path.splitext(filePath)[1] #使用"文件名+sheet_name"作為各獨立Excel文件的文件名
pd.DataFrame(value).to_excel(filename, sheet_name=key, index=False, header=True)
print(filename)
print('OK!')
if __name__=="__main__":
dirPath=r'D:\課程\學生基礎信息'
filePath=r'D:\課程\學生基礎信息\成績匯總.xlsx'
import time
time0=time.time()
merge_ExcelFiles(dirPath,'合並New.xlsx')
# split_ExcelFiles(filePath)
time1=time.time()
print("Spending Time:{:.3f}s".format(time1-time0))