--- tags: python --- # 透過Python合併多個Excel到CSV檔 [**GitHub**](https://github.com/JingShun/PythonScript/blob/main/MergeExcelToCsv.py) 因審計處的一位劉大哥的需求而有了這篇小工具的實作 需求: - [x] 1. 讀取Excel - [x] 2. 讀取每個Sheet - [x] 3. 忽略開頭指定行數 - [x] 4. 另存成CSV ## 怎麼讀取整個Excel(所有sheet) ```python= import pandas as pd file = 'test.xlsx' sheet_to_df_map = pd.read_excel(file, header=None, sheet_name=None) ``` header=None : 資料沒有標題 sheet_name=None : 要讀取的sheet指定None代表讀取全部 ## 如何忽略/刪除標題(開頭幾行) ```python= file = 'test.xlsx' sheet_to_df_map = pd.read_excel(file, header=None, sheet_name=None) ignoreLines = 1 # 要刪除開頭幾行 for sheetName in sheet_to_df_map: # 刪除開頭ignoreLines的行數 i = 0 while i < ignoreLines: sheet_to_df_map[sheetName] = sheet_to_df_map[sheetName].iloc[1:, :] i += 1 ``` ## 如何忽略整列都是NAN的列 ```python= sheet_to_df_map[sheetName] = sheet_to_df_map[sheetName].dropna(how='all') ``` 我們在 dropna() 方法中設定 how='all',讓該方法只在行的所有列值都是 NaN 時才刪除行。 ## 怎麼合併兩張表 ```python= mergeData = pd.DataFrame() mergeData = pd.concat([ pd.DataFrame.from_records(mergeData), pd.DataFrame.from_records(sheet_to_df_map[sheetName]) ], ignore_index=True) ``` ignore_index=True : 忽略行數 ## 如何匯出成csv ## 完整程式 使用方式 ``` python3 demo.py [<要忽略的行數>=0 [<相對路徑=./> [<匯出的檔案名稱.csv>=export.csv]]] python3 demo.py 3 ./ export.csv ``` 程式 ```python= import glob import pandas as pd import sys # 讀取命令參數 import os # 要忽略前面幾行 ignoreLines = int(sys.argv[1] if len(sys.argv) > 1 else 0) # 要合併的路徑 path = sys.argv[2] if len(sys.argv) > 2 else '' # 處理後另存檔案 reportName = sys.argv[3] if len(sys.argv) > 3 else 'export.csv' # 最終合併的數據 mergeData = pd.DataFrame() # 取得Excel清單 fileList = glob.glob(os.path.join(path, "*.xls[x]*")) # 讀取檔案清單 for file in fileList: print("讀取" + file) sheet_to_df_map = pd.read_excel(file, header=None, sheet_name=None) # 讀取sheet清單 for sheetName in sheet_to_df_map: print("取出" + sheetName) # 刪除開頭ignoreLines的行數 i = 0 while i < ignoreLines: sheet_to_df_map[sheetName] = sheet_to_df_map[sheetName].iloc[1:, :] i += 1 # 刪掉全是NaN的列 sheet_to_df_map[sheetName] = sheet_to_df_map[sheetName].dropna(how='all') # 合併兩個DataFrame mergeData = pd.concat([ pd.DataFrame.from_records(mergeData), pd.DataFrame.from_records(sheet_to_df_map[sheetName]) ], ignore_index=True) print("輸出最終結果") print(mergeData) # 匯出成csv mergeData.to_csv(reportName, index=False) ```