Python 批次轉換Excel活頁簿的格式

Sean Yeh
Python Everywhere -from Beginner to Advanced
13 min readSep 15, 2022
Cape Eluanbi, Taiwan ,photo by Sean Yeh

多年來,微軟Microsoft Excel軟體可以說是上班族在辦公室常用的軟體。很多跟數字有關的資料,都會選擇使用Excel檔案來儲存。因此,大家的電腦裡面應該躺著很多副檔名為xls或xlsx的 Excel檔案吧。

問題源起

由於微軟Microsoft Excel曾進行過較大幅度的改版。副檔名也從xls換成xlsx。在大部分時候,您會將活頁簿儲存為目前的檔案格式 (.xlsx) 。 但有時候,您有可能想將活頁簿儲存為其他檔案格式,例如較舊版本的 Excel。

又或者您的Microsoft Excel為舊版本。舊版(Excel 97–2003)的Excel可以開啟副檔名為xls的檔案,但是無法開啟副檔名為xlsx的檔案。

雖然新版的Microsoft Excel可以開啟xls檔案,但是開啟檔案時,有可能會先跳出一個警告視窗,若常常碰到這種情況,就覺得非常的不友善。

要解決這個問題,其實方式很簡單。只要「徒手」打開檔案後另存新檔,將檔案存成想要的格式(不論是xls或xlsx),就可以讓適當版本的Excel軟體(不論是新版或舊版)打開檔案。既然如此,又何必撰文?

寫這篇文章的目的,在於若想要轉檔的Excel很多、或是每天都有固定的檔案需要轉換格式、轉檔讓您覺得很無趣時。有以上情況之一,就需要借助程式來提高工作效率。照慣例在此會以Python作為解決問題的程式語言,以下將從安裝套件開始逐步來說明解決的方式。

在此會試著在資料夾中,批次挑選出副檔名為.xls的檔案,並轉換副檔名為xlsx檔。特別說明的是,這裡的轉換副檔名不只是把檔案重新命名為xlsx檔而已,而是透過下面介紹的套件開啟現有檔案並且另存檔案為新的xlsx格式的檔案。我們會使用xlwings套件來執行轉換格式的工作。

xlwings套件

xlwings是一個第三方的Python套件,它可以從Microsoft Excel 中輕鬆地呼叫Python,反之亦可以從Python輕鬆地操控Microsoft Excel。

安裝套件

進行格式轉換前需要安裝Xlwings套件。pip是Python提供的一個命令,透過這個命令可以安裝與移除第三方套件。在此可以使用pip安裝套件:

$ pip install xlwings

如果您使用的是Anaconda的話,可以透過Anaconda的圖形介面安裝或使用下面指令安裝。

$ conda install xlwings

匯入套件

安裝完畢後,即可使用import語法匯入xlwings套件。

import xlwings as xw

順道一提的是,xlwings會假設開發者的.xlsx 檔案將被Microsoft Excel程式開起來。因此在使用前應先確認您的電腦開發環境中是否已安裝Microsoft Excel應用程式。

啟動Excel程式

xlwings套件對Microsoft Excel程式的操作,都需要先透過App方法來啟動 Excel程式,透過下面的程式碼可以啟動Excel程式:

app = xw.App(visible=False, add_book=False)

上述程式碼(指定給app變數)會啟動Excel程式。您不難看到程式碼中的App包含兩個參數,visible與add_book。前者將決定Excel程式的視窗是否可以被看見,後者則用來決定是否要新建立活頁簿。易言之,參數visible與add_book:

  • visible: 為True時,表示啟動excel程式後顯示程式視窗;若為False,則表示excel程式啟動後,程式視窗會在背景中執行;
  • add_book:為True時,表示啟動excel程式後,會新建一個空白活頁簿;反之,若為False時,則表示啟動excel程式後,不會建立活頁簿。

目前上述程式碼的兩個參數都被設定為False。亦即不會看到Excel程式的視窗,且Excel程式啟動之後也不會建立新建立活頁簿。

開始進行批次轉換Excel活頁簿前,我們先說明一下三個xlwings套件的基礎使用方式。

基礎1:建立新活頁簿並儲存之四個步驟

首先,從最基礎的建立新活頁簿開始。又可分為下面四個步驟:

1. 建立活頁簿

透過App物件的books.add方法,可以建立新活頁簿。books是所有Book對象的集合,而books中的 add() 可以用來建立一個新的活頁簿,並且該活頁簿會成為目前可以被操作的活頁簿。

add()

如下面這段程式碼,我們把 books.add() 指定給一個變數,以便於後續的操作:

wb = app.books.add()

2. 儲存活頁簿

當活頁簿被建立後,就會想要把活頁簿儲存成檔案。活頁簿的存檔,可以使用App物件的save來進行。

如果對用來儲存活頁簿的save函式提供路徑,它的作業方式就會類似於Excel中的另存新檔( SaveAs());反之,如果若沒有指定路徑,且之前並沒有儲存過該活頁簿的話,save函式就會以目前活頁簿的檔名保存在現在的工作目錄中,並且覆蓋現存的文件。

# 未提供路徑,存在現在的工作目錄中
wb.save()
# 提供路徑,存在路徑的目錄中
wb.save(file_name)

3. 關閉活頁簿

儲存後,就可以使用 close 關閉活頁簿。

wb.close()

save與close都是xlwing模組中Book物件的函式,save函式可以放入參數作為存檔的路徑,而close函式則沒有參數。

4. 退出

最後,再使用quit退出app應用程序。quit是xlwing模組中App物件的函式,該函式也沒有參數。

app.quit()

綜合上面的幾個步驟,建立新活頁簿並儲存活頁簿的程式碼如下:

import xlwings as xw
app = xw.App(visible=False, add_book=False)
file_name = 'test_2.xlsx'
wb = app.books.add()
wb.save(file_name)
wb.close()
app.quit()

以上的操作可以說是使用xlwings的起手式。

基礎2:開啟現有活頁簿

暸解xlwings的起手式之後,可以進一步讓xlwings模組幫我們開啟現有活頁簿。這也算是xlwings基礎操作的一種。

如上xlwings文件所記載,開啟現有活頁簿需要用到App物件中的books.open方法,並且需提供filename路徑作為參數給books.open。如果提供的參數裡面只有檔名,沒有完整路徑的話,xlwings會開啟目前工作目錄裡面對應的檔案。

# 無完整路徑
path_to_file_1 = 'test_2.xlsx'
app.books.open(path_to_file_1)
# 有完整路徑
path_to_file_2 = '\urs\Desktop\source\test_3.xlsx'
app.books.open(path_to_file_2)

執行開啟現有活頁簿的程式碼時可以將App物件的參數visible由False改為True。這樣子一來,執行時就可以看到Excel視窗被開啟。

app = xw.App(visible=True, add_book=False)

綜合以上說明,開啟現有活頁簿的程式碼可以用下面方式撰寫:

import xlwings as xw
app = xw.App(visible=True, add_book=False)
path_to_file = 'test_2.xlsx'app.books.open(path_to_file)

基礎3:開啟指定資料夾下所有活頁簿

到目前為止,我們已經暸解如何開啟新活頁簿檔案以及開啟現有活頁簿檔案的方式,接著,要再進一步開啟指定資料夾下所有活頁簿。要開啟資料夾內所有的活頁簿,大致上需要經過下面四個步驟:

1.匯入Path

在Python中要開啟檔案可以使用pathlib模組,它是Python的內建模組不需要安裝。需要使用時只要匯入模組即可,由於要用到的是該模組裡面的Path類別,因此可以使用from的方式匯入:

from pathlib import Path

2.提供目錄的路徑

Path類別代表資料夾和檔案的路徑,若要使用該類別,需要先將它實體化為一個物件。我們可以用下面方式實體化Path類別,並且賦予它一個變數path_to_folder,便於後續的呼叫使用。

path_to_folder = Path('./excels/')

在實體化的過程中,需要提供Path類別一個路徑,如上程式碼,所提供的路徑是工作目錄裡面的excels資料夾。

3.找出目錄中的所有檔案名稱

使用glob可以取出目錄中特定檔案類型的所有檔案名稱,並且返回檔案所在的路徑。而glob()的參數即為尋找的條件。由於我們想要取出excels目錄中,所有以xls為副檔名的檔案,可以透過glob來達成這個結果。

glob的參數 .xls 是以萬用字元(*)加上關鍵字xls,表示所有以xls關鍵字結尾的檔名,都是符合條件的檔案。

files = path_to_folder.glob('*.xls')

4.巡迴目錄,開啟檔案

透過for迴圈,遍尋前面的files,並且使用open來開啟所有符合條件的活頁簿。

for file in files:
app.book.open(file)

綜合上面的步驟,合併為以下的程式碼。

from pathlib import Path
import xlwings as xw
app = xw.App(visible=True, add_book=False)
path_to_folder = Path('./excels/')
files = path_to_folder.glob('*.xls')
for file in files:
app.book.open(file)

執行後,將會自動開啟excels資料夾裡面,副檔名為xls的活頁簿。

批次轉換Excel活頁簿的格式

最後,我們要結合上面的三項基礎操作方式,將舊版Excel格式xls轉換為新版的xlsx。

轉換的對象為專案工作目錄中的files資料夾,也就是可以批次的將多個副檔名為xls的檔案轉換為副檔名為xlsx的新版Excel檔案。

1.匯入Path

如上述基礎3的示範,為了要取出工作目錄中的files資料夾的所有xls檔案,需要匯入pathlib中的Path類別。

from pathlib import Path

2.提供目錄的路徑並找出其中所有符合的檔案

指定為變數folder的Path物件,提供了路徑。使用glob函式取出files資料夾內所有符合條件為「xls」的活頁簿檔名。

folder = Path('./files')
file_lists = folder.glob('*.xls')

3.巡迴目錄,開啟檔案

與前面的說明一樣,使用for迴圈,遍尋前面的file_lists,並且使用open來開啟所有符合條件的活頁簿。

for file in file_lists:
workbook = app.books.open(file)

4.儲存為新檔案名稱

由於我們希望可以從新命名檔案的副檔名,因此當透過open函式來開啟所有符合條件的活頁簿後,需要先給予包含新的副檔名的名稱後,才可以用新名稱再次儲存所有的活頁簿。這個階段可以再分成下面幾個步驟:

# save儲存檔案

使用save可以儲存檔案,這時我們需要在save函式中給它參數(new_file_path),該參數new_file_path為儲存後的新檔名。

for file in file_lists:

workbook = app.books.open(file)
workbook.save(new_file_path)

# with_suffix產生副檔名

新檔名的副檔名可以透過with_suffix函式來實現。with_suffix函式是pathlib.Path模組中的函式。它

可以取代原路徑中檔案的副檔名,從而得到新的路徑。因此我們將希望的新副檔名xlsx放在with_suffix函式中做為參數:

new_file_path = file.with_suffix('.xlsx')

使用上面程式碼來提供新的副檔名路徑。把上面這一行加入前面的程式碼中,可以將程式碼放在 workbook = app.books.open(file) 的前面:

for file in file_lists:
new_file_path = file.with_suffix('.xlsx')
workbook = app.books.open(file)
workbook.save(new_file_path)

處理完上述的程序後,要關閉活頁簿與退出應用程式。

# close關閉活頁簿

如同基礎1,儲存後,就可以使用 close 關閉活頁簿。

workbook.close()

上述的這一行程式碼要放在for迴圈中。

for file in file_lists:
new_file_path = file.with_suffix('.xlsx')
workbook = app.books.open(file)
workbook.save(new_file_path)
workbook.close()

# quit退出應用程序

同樣的,使用quit退出app應用程序,而這一行程式碼要放在for迴圈外。

app.quit()

5.執行完整程式

執行下面的程式碼,可以批次的將副檔名為xls的Excel活頁簿轉換為xlsx的格式。

from pathlib import Path
import xlwings as xw
app = xw.App(visible=False, add_book=False)folder = Path('./files')file_lists = folder.glob('*.xls')for file in file_lists:
new_file_path = str(file.with_suffix('.xlsx'))
workbook = app.books.open(file)
workbook.save(new_file_path)
workbook.close()
app.quit()

結語

xlwings 這個Python第三方套件,不僅可以從Microsoft Excel中輕鬆地呼叫Python,亦可以從Python操控Microsoft Excel。xlwings不只是用來轉換EExcel格式,與 Python搭配,可以建立各種對Microsoft Excel讀取與寫入程序。諸如用來自動產生報告、建立Excel函數、操作Excel或CSV資料等,讓Python輕鬆實現Microsoft Excel的自動化。

本文僅使用到xlwings的最小部分,其他功能的實作方式留待未來有機會再撰文說明。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。