20201207-2 openpyxl 庫與模塊導入


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

fromimport…是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_rowmax_row分別表示最小行索引和最大行索引,最小行索引的值默認為1,最大行索引的值默認為表格中有數據的最下面一行的行數;
參數min_colmax_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語句跳過了表頭。
第十六行代碼,修改了單元格對象原有的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM