1-1 import openpyxl # 通過文件路徑,打開工作簿 wb1 = openpyxl.load_workbook('./demo_excel.xlsx') # 用 Workbook() 創建新工作簿 wb2 = openpyxl.Workbook() openpyxl庫可以處理Excel2010以后的電子表格格式,包括:xlsx/xlsm/xltx/xltm 要使用openpyxl庫,需要先導入 先用import直接導入了openpyxl庫,然后用openpyxl.load_workbook()打開已有工作簿,用openpyxl.Workbook()創建新工作簿。 但是每次使用我們都要帶openpyxl.,這樣就有點兒麻煩。
1-1-1 from openpyxl import load_workbook, Workbook # 通過文件路徑,打開已有工作簿 wb1 = load_workbook('./demo_excel.xlsx') # 用 Workbook() 創建新工作簿 wb2 = Workbook() from…import…是import語句的一個變體,可以導入庫或模塊中的函數、方法、類或變量。 語法為:from 庫/模塊 import 函數/方法/類/變量。 可以用from…import…一行導入多個名字,不同名字間用逗號分隔。 例如:from 庫/模塊 import 函數1, 類1。 注意第一行代碼,寫為from openpyxl import load_workbook, Workbook,接下來就可以直接使用被導入的函數/方法/類/變量。
兩種寫法對比一下,同樣是打開三個工作簿和創建三個新的工作簿,下面的寫法明顯更簡單,更高效一些。
2-1 獲取工作簿對象 from openpyxl import load_workbook # 打開【公司人員名單.xlsx】工作簿 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') # 打印工作簿對象 print(staff_wb) 使用openpyxl庫中的一個函數load_workbook(filename),參數filename代表了工作簿的路徑,即.xlsx文件的路徑。這個函數會返回一個工作簿對象 運行代碼后,我們得到了打印出來的工作簿對象: <openpyxl.workbook.workbook.Workbook object at xxxxxxxx>。 結果中的Workbook object(Workbook對象)就是工作簿對象,出現這樣的結果,也就意味着我們已經成功使用代碼打開了【公司人員名單.xlsx】這個文件,並且獲得代表它的工作簿對象。
2-2 還可以通過實例化Workbook類來獲取工作簿對象,更准確地來說,這是一種創建工作簿對象的方式。 語法很簡單,寫為Workbook()即可,括號里面不需要寫任何參數。 from openpyxl import Workbook # 新建工作簿 new_wb = Workbook() # 打印工作簿對象 print(new_wb) 輸出結果中同樣顯示<openpyxl.workbook.workbook.Workbook object at xxxxxxxx>,證明工作簿對象已經被成功創建。 以上就是獲取工作簿對象的兩種途徑
3-1 工作簿對象的基本操作 如果要把新建的工作簿對象保存到本地,就需要使用工作簿對象的方法save()。 語法為:工作簿對象.save(filename),參數filename表示新工作簿的文件路徑,這里我推薦以.xlsx作為新工作簿的路徑結尾。 from openpyxl import Workbook # 新建工作簿 new_wb = Workbook() # 將新建的工作簿保存為【new_excel.xlsx】 new_wb.save('./new_excel.xlsx') 通過load_workbook(filename)獲取到的工作簿對象也可以使用方法save(filename)。 如果參數filename不變,即保存在原有路徑,相當於修改原文件;若參數filename變化,即保存在新的路徑,相當於另存為新的文件。
4-1 練習
1 from openpyxl import load_workbook, Workbook 2 3 # 打開【practice0.xlsx】工作簿 4 practice_wb = load_workbook('./material/practice0.xlsx') 5 # 打印工作簿對象 6 print(practice_wb) 7 8 # 新建工作簿對象 9 new_wb = Workbook() 10 # 打印新建的工作簿對象 11 print(new_wb) 12 13 # 將新建的工作簿保存為【practice0_result.xlsx】 14 new_wb.save('./material/practice0_result.xlsx')
第四行代碼,先用函數load_workbook()
打開了目標文件,這里需要注意文件的路徑是否正確。
第九行代碼,通過實例化Workbook
類來新建工作簿對象。
最后一行代碼,使用工作簿對象的方法save()
將新建的工作簿保存下來,還是需要注意文件的路徑是否正確。
5-1-1 如何獲取工作表對象 from openpyxl import load_workbook # 打開【公司人員名單.xlsx】工作簿 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') # 獲取活動工作表 active_ws = staff_wb.active # 打印工作簿對象 print(staff_wb) # 打印工作表對象 print(active_ws) 工作表就是工作簿中,位於下方的標簽。在實際操作中,我們可以通過點擊不同的標簽,來選擇不同的工作表。 現實中的工作表,在openpyxl中對應着工作表對象(Worksheet對象)。 一個工作表對象(Worksheet對象)就表示工作簿中的一張工作表。 常用的獲取工作表的方式有兩種,第一種就是通過工作簿對象的屬性active。 active會獲取到活動的工作表,活動工作表是指當前正在操作的工作表,打開一個.xlsx文件后,默認顯示的工作表即為活動工作表。
代碼分別打印了工作簿對象(Workbook)和工作表對象(Worksheet),要注意區分它們。
5-1-2 按表名取表 from openpyxl import load_workbook # 打開【公司人員名單.xlsx】工作簿 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') # 按表名取表 fhy_ws = staff_wb['上半年公司名單'] # fhy為first half year(上半年)的縮寫 shy_ws = staff_wb['下半年公司名單'] # shy為second half year(下半年)的縮寫 # 打印工作簿對象 print(staff_wb) # 打印工作表對象 print(fhy_ws) print(shy_ws) 如果我們已知工作表的名稱,就可以以表名為索引,用工作簿對象['表名']的方式取到指定的工作表對象。一般情況下,如果工作簿中存在多張工作表,且我們知道這些工作表的名稱,就可以采用按表名取表這種方式。
對比兩種獲取工作表對象的方式,可以根據實際需要自行決定使用哪一種寫法。
5-2 工作表對象的基本操作 5-2-1 獲取單行或單列 from openpyxl import load_workbook # 打開【公司人員名單.xlsx】工作簿 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') # 獲取活動工作表 active_ws = staff_wb.active # 打印獲取到的第五行數據 print(active_ws[5]) # 打印獲取到的第二列數據 print(active_ws['B']) 在Excel表格中,使用數字表示行數,用英文字母表示列名 在openpyxl中,通過工作表對象[行數]或工作表對象['列名']的方式獲取到一個元組,這個元組中包含了指定行或列中的所有數據。 元組中的每一個元素均為<Cell '工作表名稱'.坐標>的形式,Cell是單元格對象。
5-2-2 獲取多行數據
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') 5 # 獲取【'上半年公司名單'】工作表 6 fhy_ws = staff_wb['上半年公司名單'] 7 8 # 返回第2行至第12行,第2列(B列)至第3列(C列)這個范圍的單元格內的所有數據(值) 9 for row in fhy_ws.iter_rows(min_row=2, max_row=12, min_col=2, max_col=3, values_only=True): 10 print(row)
可以借助工作表對象的方法iter_rows()
來得到表格中指定范圍內的多行數據。
參數min_row
和max_row
分別表示最小行索引和最大行索引,最小行索引的值默認為1,最大行索引的值默認為表格中有數據的最下面一行的行數;
參數min_col
和max_col
分別表示最小列索引和最大列索引,最小列索引的值默認為1,最大列索引的值默認為表格中有數據的最右面一列的列數;
參數values_only
決定是否返回單元格的值,如果為True則返回單元格的值,如果為False則返回單元格對象。
通常情況下,只讀數據時,需要將該參數設置為True,要寫入數據時,保持其為默認的False就好。
工作表對象的方法iter_rows()
會返回一個可迭代對象,該對象中有n個元組,n為參數中指定的行數,每一個元組都代表了表格中的一行。
因此,通常情況下,iter_rows()
會和for循環結合使用,從而使得我們取出其返回的可迭代對象中的每一個元組,即表格中指定范圍內的每一行數據。
當參數values_only
保持其默認的False時,iter_rows()
方法會返回指定范圍內的單元格對象
5-2-3 添加數據
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./公司人員名單.xlsx') 5 # 獲取活動工作表 6 active_ws = staff_wb.active 7 8 info_list = ['S1911', '蕭爵瑟', 3000, '內容'] 9 info_tuple = ('S1912', '吳瑣薇', 5000, '銷售') 10 11 active_ws.append(info_list) 12 active_ws.append(info_tuple) 13 14 # 保存工作簿為【append_demo.xlsx】 15 staff_wb.save('./append_demo.xlsx')
可以使用工作表對象的append()
來添加一行數據。
該方法可將部分可迭代對象(常見的如列表、元組)添加到工作表對象中,即給表格的末尾追加一行數據。
語法也很簡單,寫為工作表對象.append(列表/元組)
即可。
需要注意的是,使用append()添加完數據后,如果想要在本地的Excel文件中看到添加后的數據,就一定要將工作簿保存下來,即使用工作簿對象的方法save()
。
上面的代碼中,添加了兩行數據,兩行數據分別為列表和元組,並且它們確實是被添加到了工作表的最后。
5-3
"""題目要求
1. 打開material文件夾下的文件practice1.xlsx,獲取下半年公司名單工作表。
2. 然后打印出第5到第10行,前三列的所有數據(值)。
3. 再給工作表的最后一行添加數據'S1911', '蕭爵瑟', 3000, '內容'。
4. 然后將結果保存在material文件夾下,並命名為`practice1_result.xlsx`。
"""
1 from openpyxl import load_workbook 2 3 # 打開【practice1.xlsx】工作簿 4 staff_wb = load_workbook('./material/practice1.xlsx') 5 # 按表名取表 6 staff_ws = staff_wb['下半年公司名單'] 7 8 # 打印出第5到第10行,前三列的所有數據 9 for row in staff_ws.iter_rows(min_row=5, max_row=10, max_col=3, values_only=True): 10 print(row) 11 12 # 在工作表最后增加數據 13 info_tuple = ('S1912', '吳瑣薇', 5000, '銷售') 14 staff_ws.append(info_tuple) 15 16 # 保存結果為【practice1_result.xlsx】 17 staff_wb.save('practice1_result.xlsx')
第六行代碼,可以使用按表名取表,獲取到需要的工作表對象。
第九行代碼,使用iterrows()獲取指定范圍內的數據,根據題目要求,要將valuesonly的值設置為True。
第十四行代碼,使用append()將元組添加到工作表的最后一行。
6-1-1 獲取單元格對象
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') 5 # 獲取【'上半年公司名單'】工作表 6 fhy_ws = staff_wb['上半年公司名單'] 7 8 # 返回第2行至第12行,第2列(B列)至第3列(C列)這個范圍的所有單元格對象 9 for row in fhy_ws.iter_rows(min_row=2, max_row=12, min_col=2, max_col=3): 10 print(row)
三種常見的獲取單元格對象的方式
第一種方式就是通過for row in 工作表對象.iter_rows()
來獲取指定范圍的行,
當參數values_only
為默認的False時,得到的row就是一個個由單元格對象組成的元組,
可以通過索引或者for循環遍歷的方式來獲取單獨的單元格對象。
第8至10行代碼,獲取並打印了表格中第2行至第12行,第2列(B列)至第3列(C列)這個范圍內的所有單元格對象。
一句話總結下第一種方式:通過iter_rows()
來獲取指定范圍的行,再通過索引從行中取出單元格對象。
6-1-2
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') 5 # 獲取活動工作表 6 staff_ws = staff_wb.active 7 8 # for循環遍歷,取出第三行的所有單元格對象 9 for row_cell in staff_ws[3]: 10 print(row_cell) 11 12 # for循環遍歷,取出第三列(C列)的所有單元格對象 13 for col_cell in staff_ws['C']: 14 print(col_cell)for cell in 工作表對象[行數]
for cell in 工作表對象['列名']
一句話總結下第二種方式:通過行數或者列名來指定具體的行或列,然后通過for循環遍歷獲取指定行或列中的每一個單元格對象。
6-1-3 通過工作表對象['單元格坐標']
來獲取具體的單元格對象
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') 5 # 獲取活動工作表 6 staff_ws = staff_wb.active 7 8 # 打印單元格對象A1 9 print(staff_ws['A1'])
一句話總結下獲取單元格對象的第三種方式:通過單元格坐標來指定具體的單元格,從而獲取到對應的單元格對象。
6-2 單元格對象的基本操作 借助單元格對象的屬性value,就可以得到具體的數據; 也可以通過這個屬性給單元格對象賦值(修改單元格的值或給單元格添加值)。 # 獲取單元格的值 單元格對象.value # 給單元格對象賦值 單元格對象.value = 值
6-2-1
1 from openpyxl import load_workbook 2 3 # 打開【公司人員名單.xlsx】工作簿 4 staff_wb = load_workbook('./codes/material/公司人員名單.xlsx') 5 # 獲取活動工作表 6 staff_ws = staff_wb.active 7 8 # 打印單元格對象C2的值 9 print(staff_ws['C2'].value) 10 11 # 修改單元格對象C2的值為10000 12 staff_ws['C2'].value = 10000 13 14 # 打印修改后的單元格對象C2的值 15 print(staff_ws['C2'].value) 16 17 # 將結果保存為【公司人員名單_new.xlsx】 18 staff_wb.save('./codes/material/公司人員名單_new.xlsx')
通過第8行代碼,打印出了單元格C2原有的值8000。
第11至15行,通過單元格對象.value
將10000賦值給單元格C2,改變了其原有的值,並將修改后的結果打印了出來。
7-1
"""題目要求
1. 通過代碼,打開material文件夾下的文件practice2.xlsx,獲取下半年公司名單工作表。
2. 打印第四列(D列)除表頭部門外的所有數據。
3. 將原有的值全部修改為戰略儲備部。
4. 將結果保存為practice2_result.xlsx。
"""
1 from openpyxl import load_workbook 2 3 # 打開【practice2.xlsx】工作簿 4 staff_wb = load_workbook('./material/practice2.xlsx') 5 # 按表名取表 6 staff_ws = staff_wb['下半年公司名單'] 7 8 # 循環獲取第四列(D列)的所有單元格對象 9 for col_cell in staff_ws['D']: 10 # 如果為表頭,則跳過本次循環 11 if col_cell.value == '部門': 12 continue 13 # 打印原有的值 14 print(col_cell.value) 15 # 將原有的值修改為'戰略儲備部' 16 col_cell.value = '戰略儲備部' 17 18 # 將結果保存為【'practice2_result.xlsx'】 19 staff_wb.save('./material/practice2_result.xlsx')
第九行代碼,獲取到了工作表對象的第四列(D列)。
第十一、十二行代碼,綜合if條件判斷和continue語句跳過了表頭。
第十六行代碼,修改了單元格對象原有的值。