---
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)
```