Python | 使用Python操作Excel文檔(一)
0 前言
在閱讀本文之前,請確保您已滿足或可能滿足以下條件:
-
請確保您具備基本的Python編程能力。
-
請確保您會使用Excel。
-
請確保您的電腦已經安裝好Python且pip可用。
另外操作Excel需要使用openpyxl模塊,請安裝好該模塊:
pip install openpyxl
演示環境:
-
演示環境為win10+Python3.6
-
openpyxl版本為2.6.2
-
調試工具為IDLE
1. openpyxl簡述
openpyxl操作Excel的第三方庫,作者是Eric Gazoni, Charlie Clark。您也可以訪問openpyxl的官方網站通過官方手冊進行學習。同時附上官方網站的地址:
https://openpyxl.readthedocs.io/en/stable/index.html。
目前openpyxl的最新版本是2.6.2版本。在openpyxl之前,我們使用xlrd和xlwt來操作Excel表格,事實上這兩個庫也非常好用,一讀一寫,然而遺憾的是它們只能操作2003及以前的版本,而openpyxl卻能支持2010版本。
另外這里附上源碼地址,感興趣的同學可以自行下載學習或者參與開發:
http://bitbucket.org/openpyxl/openpyxl/src
2. 創建/讀取一個Excel工作簿
我們知道一個xlsx文件叫做工作簿,工作簿中的每一張表叫做工作表,表中每個格叫做單元格。
創建工作簿,示例代碼如下:
from openpyxl import Workbook
wb = Workbook().save("example.xlsx")
Workbook對象是一個用來創建一個工作簿,save方法用來將這個對象保存成一個文件。
可以查看一下,程序執行的目錄下是不是出現了一個example.xlsx文件。這時,是一個全新的文件,里面只有一張默認的表。
讀取已存在的xlsx文件,使用openpyxl中的load_wordbook()方法。示例代碼如下:
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
4. 操作Excel表:讀取,創建,刪除,復制
每個工作表都是一個Worksheet對象。
首先訪問wb的sheetnames屬性來獲取文件中的所有工作表的名字,:
wb.sheetnames # ['Sheet']
一般來說,當我們打開一個Excel表格,會看到上次我們保存的表。這個表是活動狀態的。我們可以使用Workbook類中的active屬性來讀取這張表。
ws = wb.active
ws就是我們要操作的表了。你可以使用ws的title屬性來獲取表明,一般當我們創建一個xlxs文件的時候,會默認創建一張表Sheet,接下來我們對ws的操作,就是對這張表的操作,可以理解成對ws的操作會反映到這張表上。
例如訪問ws的title屬性,可以獲取或修改表名。ws是一個Worksheet對象,也可以使用Workbook類中的get_sheet_by_name("sheet_name")方法讀取這張表。也可以使用wb[表名]的方式,但是舊版本的openpyxl可能會不知這種訪問方式。使用title給這張表重命名:
ws.title # 'Sheet'
ws = wb.get_sheet_by_name("Sheet")
ws.title # 'Sheet'
ws.title = "demo"
wb.sheetnames # ['demo']
ws = wb["demo"]
創建一張表,使用Workbook中的create_sheet()方法:
ws1 = wb.create_sheet("demo1")
wb.sheetnames # ['demo', 'demo1']
刪除一張表,使用Workbook中的remove_sheet()方法:
wb.remove_sheet(ws1)
wb.sheetnames # ['demo']
需要注意的是,也可以使用wb.remove(ws1)或del w["demo1"],但是不建議這種寫法。
復制一張表,使用Workbook中的copy_worksheet()方法:
ws2 = wb.copy_worksheet(ws)
wb.sheetnames # ['demo', 'demo Copy']
PS:舊版的openpyxl可能不支持sheetnames屬性,這時可以使用Workbook類中的get_sheet_names()方法,舊版中也可能不支持wb[表名]的訪問方式以及active屬性,這時可以使用get_active_sheet()方法
5. 操作單元格
每個單元格都是一個Cell對象。
訪問單元格,需要使用坐標,坐標的表示方式有兩種,一種是使用字符串,如‘A1’,表示的是第一列,第一行。。另一種就是使用標准得坐標如,column=1, row=1,利用ws中的cell方法來第一行第一列的單元格。訪問單元格的方式是使用如ws['A1'], 即表變量[坐標]
ws['A1'] = 0
ws.cell(row=1, column=1, value=0)
print(ws['A1'].value) # 0
需要強調的是,雖然可以直接給單元格賦值,但是要讀取這個值,還是需要訪問Cell類中的value屬性的。而且坐標必須從1開始。
PS:部分舊版可能不支持表變量[坐標]的訪問方式,這時,可以使用ws.Cell('A1')或ws.Cell(column=1, row=1)的方式來訪問。
6. 向表中寫入大量數據
for i in range(1, 20):
for j in range(1, 20):
ws.cell(i,j,value=i*j)
需要注意的是,使用cell時,坐標至少是1,也就是說,大於0的整數。
wb.save("example.xlsx")
好,到這里,我們保存,來看下效果。
7.復習下今天內容
關於使用openpyxl操作Excel文檔,應該要先了解openpyxl提供的三個類:
-
Workbook類用來創建工作簿、讀取、創建,刪除,復制工作表等。
-
load_workbook方法會讀取已存在的工作簿,返回Workbook對象
-
Worksheet類用來進行表的操作,比如訪問單元格。返回Cell對象。
