Spreadsheet(電子表格) 或者 Workbook(工作簿) – 指檔案本身(.xls or .xlsx).Worksheet(工作表) 或者 Sheet(表)–工作簿中的單個內容表,電子表格可以包含多個工作表。Column(列) – 用英文字母標記的垂直數列,以“ A”開頭。Row(行) – 從1開始以數字標記的水平數列。Cell(單元格) – 列和行的組合,例如“ A1”。
在本文中,我們來使用Python處理Excel電子表格。您將瞭解以下內容:
Python 讀寫 Excel 的第三方庫從工作簿中獲取工作表讀取單元格資料遍歷行和列寫入 Excel 電子表格新增和刪除工作表新增和刪除行和列大多數公司和大學都使用Excel,它可以用多種不同方式使用,並可以使用Visual Basic for Applications(VBA)進行增強。但是,VBA有點笨拙,這就是為什麼要學習如何將 Excel 與 Python 結合使用。
現在讓我們瞭解如何使用 Python 處理 Microsoft Excel 電子表格!
Python 處理 Excel 的第三方庫
https://openpyxl.readthedocs.io/en/stable/OpenPyXL 並不是您唯一的選擇,其實還有其他幾個支援 Microsoft Excel 的軟體包:
xlrd – 用於讀取舊格式的 Excel (.xls) 檔案xlwt – 用於寫入舊格式的 Excel (.xls) 檔案xlwings – 用於新格式的Excel格式並具有宏功能幾年前,前兩個曾經是 Python 操作 Excel 文件的最受歡迎的庫。然而,這些軟體包的作者已停止維護它們。xlwings軟體包潛力很大,但是不能在所有平臺上都起作用,並且需要安裝 Microsoft Excel。
您將在本文中使用 OpenPyXL,因為它是在持續開發和維護的。OpenPyXL 不需要安裝 Microsoft Excel,並且可以在所有平臺上使用。
你可以用 pip 命令來安裝 OpenPyXL:
$ python -m pip install openpyxl
安裝完成後,讓我們瞭解如何使用 OpenPyXL 讀取 Excel 電子表格!
從工作簿中獲取工作表
第一步是找到一個與 OpenPyXL 一起使用的Excel檔案,本文專案的Github儲存庫中為您提供了一個books.xlsx檔案。您可以透過以下網址下載它:
https://github.com/driscollis/python101code/tree/master/chapter38_excel您也可以用自己的檔案,儘管您自己檔案的輸出內容與本文中的示例並不一樣。
下一步是編寫一些程式碼來開啟電子表格。為此請建立一個名為open_workbook.py的新檔案,並將以下程式碼新增到其中:
# open_workbook.pyfrom openpyxl import load_workbookdef open_workbook(path): workbook = load_workbook(filename=path) print(f'Worksheet names: {workbook.sheetnames}') sheet = workbook.active print(sheet) print(f'The title of the Worksheet is: {sheet.title}')if __name__ == '__main__': open_workbook('books.xlsx')
在上述示例中,您從 openpyxl 匯入 load_workbook()函式,然後建立open_workbook()函式,以將其匯入Excel電子表格的路徑中。接下來,使用load_workbook()建立一個openpyxl.workbook.workbook.Workbook物件。該物件使您可以訪問電子表格中的工作表和單元格。它確實確實具有雙重工作簿的名稱,那不是錯字!
open_workbook()函式的其餘部分演示瞭如何打印出電子表格中所有當前定義的工作表,如何獲取當前活動的工作表以及如何列印該工作表的標題。
執行此程式碼時,將看到以下輸出:
Worksheet names: ['Sheet 1 - Books']<Worksheet "Sheet 1 - Books">The title of the Worksheet is: Sheet 1 - Books
既然已經知道如何訪問電子表格中的工作表,下面就可以繼續訪問單元格資料了!
讀取單元格資料
使用Microsoft Excel時,資料儲存在單元格中。您需要使 Python 能訪問這些單元格,以便提取該資料。OpenPyXL使這個過程變得很簡單。
建立一個名為workbook_cells.py的新檔案,並新增以下程式碼:
# workbook_cells.pyfrom openpyxl import load_workbookdef get_cell_info(path): workbook = load_workbook(filename=path) sheet = workbook.active print(sheet) print(f'The title of the Worksheet is: {sheet.title}') print(f'The value of {sheet["A2"].value=}') print(f'The value of {sheet["A3"].value=}') cell = sheet['B3'] print(f'{cell.value=}')if __name__ == '__main__': get_cell_info('books.xlsx')
此指令碼將在 OpenPyXL 工作簿中載入 Excel 檔案。您將獲取當前工作表,然後打印出其標題和幾個不同的單元格值。您可以透過以下方式訪問單元格:使用工作表物件,後跟方括號以及其中的列名和行號。例如,sheet ["A2"]將為您獲取第2行 A列的單元格。要獲取該單元格的值,請使用value屬性。
注意:這段程式碼使用的是 Python 3.8 中f-字串格式化的新功能。如果使用較早的版本執行它,將會收到報錯訊息。
執行此程式碼時,將獲得以下輸出:
<Worksheet "Sheet 1 - Books">The title of the Worksheet is: Sheet 1 - BooksThe value of sheet["A2"].value='Title'The value of sheet["A3"].value='Python 101'cell.value='Mike Driscoll'
您可以嘗試使用它的某些其他屬性來獲取有關單元格的其他資訊。將以下函式新增到檔案中,並在最後更新條件語句來執行它:
def get_info_by_coord(path): workbook = load_workbook(filename=path) sheet = workbook.active cell = sheet['A2'] print(f'Row {cell.row}, Col {cell.column} = {cell.value}') print(f'{cell.value=} is at {cell.coordinate=}')if __name__ == '__main__': get_info_by_coord('books.xlsx')
在此示例中,您將使用單元格物件的行和列屬性來獲取行和列資訊。注意,“ A”列對映為“ 1”,“ B”對映為“ 2”,等等。如果要遍歷Excel文件,則可以使用座標屬性來獲取單元格名稱。
執行此程式碼時,輸出如下所示:
Row 2, Col 1 = Titlecell.value='Title' is at cell.coordinate='A2'
說到遍歷,讓我們來看一下接下來該下一步的方法!
如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python裙,關注小編,並私信“01”即可進裙,領取python學習資料,會節約很多時間,減少很多遇到的難題。
遍歷行和列
有時,您將需要遍歷整個Excel電子表格或電子表格的某些部分。OpenPyXL允許您以幾種不同的方式執行此操作。建立一個名為iterating_over_cells.py的新檔案,並向其中寫入以下程式碼:
# iterating_over_cells.pyfrom openpyxl import load_workbookdef iterating_range(path): workbook = load_workbook(filename=path) sheet = workbook.active for cell in sheet['A']: print(cell)if __name__ == '__main__': iterating_range('books.xlsx')
在這裡,您載入了電子表格,然後遍歷“ A”列中的所有單元格。對於每個單元格,將打印出單元格物件。如果要更精細地格式化輸出,則可以使用在上一節中提到的一些單元格屬性。
這是透過執行此程式碼得到的:
<Cell 'Sheet 1 - Books'.A1><Cell 'Sheet 1 - Books'.A2><Cell 'Sheet 1 - Books'.A3><Cell 'Sheet 1 - Books'.A4><Cell 'Sheet 1 - Books'.A5><Cell 'Sheet 1 - Books'.A6><Cell 'Sheet 1 - Books'.A7><Cell 'Sheet 1 - Books'.A8><Cell 'Sheet 1 - Books'.A9><Cell 'Sheet 1 - Books'.A10># output truncated for brevity
輸出被截斷,因為預設情況下它將打印出很多單元格。OpenPyXL透過使用iter_rows()和iter_cols()函式提供了其他遍歷行和列的方法。這些方法接受下面幾個引數:
min_rowmax_rowmin_colmax_col您還可以新增一個values_only引數,該引數告訴OpenPyXL返回單元格而不是單元格物件的值。繼續建立一個名為iterating_over_cell_values.py的新檔案,並將以下程式碼新增到其中:
# iterating_over_cell_values.pyfrom openpyxl import load_workbookdef iterating_over_values(path): workbook = load_workbook(filename=path) sheet = workbook.active for value in sheet.iter_rows( min_row=1, max_row=3, min_col=1, max_col=3, values_only=True, ): print(value)if __name__ == '__main__': iterating_over_values('books.xlsx')
此程式碼演示瞭如何使用iter_rows()迭代Excel電子表格中的行並打印出這些行的值。執行此程式碼時,將獲得以下輸出:
('Books', None, None)('Title', 'Author', 'Publisher')('Python 101', 'Mike Driscoll', 'Mouse vs Python')
輸出是一個Python元組,其中包含每一列中的資料。至此,您已經瞭解瞭如何開啟電子表格並從特定單元格以及透過迭代讀取資料。現在,您準備學習如何使用OpenPyXL建立Excel電子表格!
寫入 Excel 電子表格
使用OpenPyXL寫入Excel電子表格不需要很多程式碼。您可以使用Workbook()類建立電子表格。繼續建立一個名為Writing_hello.py的新檔案,並新增以下程式碼:
# writing_hello.pyfrom openpyxl import Workbookdef create_workbook(path): workbook = Workbook() sheet = workbook.active sheet['A1'] = 'Hello' sheet['A2'] = 'from' sheet['A3'] = 'OpenPyXL' workbook.save(path)if __name__ == '__main__': create_workbook('hello.xlsx')
在這裡,初始化Workbook()並獲取當前工作表。然後將“ A”列中的前三行設定為不同的字串。最後,呼叫save()函式並向其傳遞新文件儲存到的路徑。恭喜你!您剛剛使用Python建立了一個Excel電子表格。
許多人喜歡在工作簿中的多個工作表中處理資料。OpenPyXL支援透過其create_sheet()方法向Workbook()物件新增新工作表。
建立一個名為creating_sheets.py的新檔案,並新增以下程式碼:
# creating_sheets.pyimport openpyxldef create_worksheets(path): workbook = openpyxl.Workbook() print(workbook.sheetnames) # Add a new worksheet workbook.create_sheet() print(workbook.sheetnames) # Insert a worksheet workbook.create_sheet(index=1, title='Second sheet') print(workbook.sheetnames) workbook.save(path)if __name__ == '__main__': create_worksheets('sheets.xlsx')
在這裡,您使用了兩次create_sheet()將兩個新的工作表新增到工作簿中。第二個示例顯示瞭如何設定工作表的標題以及在哪個索引處插入工作表。引數index = 1表示該工作表將在第一個現有工作表之後新增,因為它們的索引從0開始。
執行此程式碼時,將看到以下輸出:
['Sheet']['Sheet', 'Sheet1']['Sheet', 'Second sheet', 'Sheet1']
您可以看到新工作表已逐步新增到您的工作簿中。儲存檔案後,可以透過開啟Excel或另一個與Excel相容的應用程式來驗證是否存在多個工作表。
# delete_sheets.pyimport openpyxldef create_worksheets(path): workbook = openpyxl.Workbook() workbook.create_sheet() # Insert a worksheet workbook.create_sheet(index=1, title='Second sheet') print(workbook.sheetnames) del workbook['Second sheet'] print(workbook.sheetnames) workbook.save(path)if __name__ == '__main__': create_worksheets('del_sheets.xlsx')
此程式碼將建立一個新的工作簿,然後向其中新增兩個新的工作表。再使用Python的del方法刪除workbook['Second sheet']。您可以透過檢視在使用del命令之前和之後工作表列表的列印輸出來驗證它是否按預期工作:
['Sheet', 'Second sheet', 'Sheet1']['Sheet', 'Sheet1']
從工作簿中刪除工作表的另一種方法是使用remove()方法。建立一個名為remove_sheets.py的新檔案,並輸入以下程式碼以瞭解其工作原理:
# remove_sheets.pyimport openpyxldef remove_worksheets(path): workbook = openpyxl.Workbook() sheet1 = workbook.create_sheet() # Insert a worksheet workbook.create_sheet(index=1, title='Second sheet') print(workbook.sheetnames) workbook.remove(sheet1) print(workbook.sheetnames) workbook.save(path)if __name__ == '__main__': remove_worksheets('remove_sheets.xlsx')
此時您可以透過將結果分配給sheet1來保留對所建立的第一個工作表的引用。然後稍後在程式碼中將其刪除。另外,您也可以使用與之前相同的語法刪除該工作表,如下所示:
['Sheet', 'Second sheet', 'Sheet1']['Sheet', 'Second sheet']
現在,繼續學習如何新增和刪除行和列。
.insert_rows().delete_rows().insert_cols().delete_cols()每一個都可以使用下面兩個引數:
idx –插入行或列的索引amount–要新增的行數或列數要檢視其工作原理,請建立一個名為insert_demo.py的檔案,並向其中新增以下程式碼:
# insert_demo.pyfrom openpyxl import Workbookdef inserting_cols_rows(path): workbook = Workbook() sheet = workbook.active sheet['A1'] = 'Hello' sheet['A2'] = 'from' sheet['A3'] = 'OpenPyXL' # insert a column before A sheet.insert_cols(idx=1) # insert 2 rows starting on the second row sheet.insert_rows(idx=2, amount=2) workbook.save(path)if __name__ == '__main__': inserting_cols_rows('inserting.xlsx')
在這裡,您將建立一個工作表,並在“ A”列之前插入一個新列。列的索引從1開始,而工作表的索引從0開始。這有效地將A列中的所有單元格移到B列。然後從第2行開始插入兩個新行。
# delete_demo.pyfrom openpyxl import Workbookdef deleting_cols_rows(path): workbook = Workbook() sheet = workbook.active sheet['A1'] = 'Hello' sheet['B1'] = 'from' sheet['C1'] = 'OpenPyXL' sheet['A2'] = 'row 2' sheet['A3'] = 'row 3' sheet['A4'] = 'row 4' # Delete column A sheet.delete_cols(idx=1) # delete 2 rows starting on the second row sheet.delete_rows(idx=2, amount=2) workbook.save(path)if __name__ == '__main__': deleting_cols_rows('deleting.xlsx')
此程式碼在多個單元格中建立文字,然後使用delete_cols()刪除A列。它還透過delete_rows()從第二行開始刪除兩行。在處理資料時,能夠新增、刪除列和行會非常有用。
總結
由於Excel在許多行業中得到廣泛使用,因此能夠使用Python與Excel檔案進行互動是一項非常有用的技能,比如幫妹紙處理運營資料。在本文中,您掌握了以下內容:
Python 處理 Excel的第三方軟體包從工作簿中獲取工作表讀取單元格資料遍歷行和列寫入 Excel 電子表格新增和刪除工作表新增、刪除行和列OpenPyXL可以做的甚至比這裡介紹的還要多。例如,您可以使用OpenPyXL將公式新增到單元格,更改字型並將其他型別的樣式應用於單元格。老老實實地閱讀文件,並嘗試在自己的一些電子表格上使用OpenPyXL,以便充分利用其功能。