openpyxl 庫


1. 簡介與安裝

2.具體示例

2.1 獲取 workbook 與 sheet 對象

2.2 訪問單元格及其值

2.3 寫數據

2.4 設置樣式 

 

  

1. 簡介與安裝

openpyxl 簡介

openpyxl 是一款比較綜合的工具,不僅能夠同時讀取和修改 Excel 文檔,而且可以對 Excel 文件內單元格進行詳細設置,包括單元格樣式等內容,甚至還支持圖表插入、打印設置等內容。使用 openpyxl 可以讀寫 xltm、xltx、xlsm、xlsx 等類型的文件,且可以處理數據量較大的 Excel 文件,跨平台處理大量數據是其它模塊沒法相比的。因此,openpyxl 成為處理 Excel 復雜問題的首選庫函數。

openpyxl 與 xlrd/xlwt 的比較

兩者都是對於 excel 文件操作的模塊,其主要區別在於:

  • 寫操作:
    • xlwt:針對E Excel 2007 之前的版本(.xls),無法生成 xlsx 文件。
    • openpyxl:主要針對 Excel 2007 之后的版本(.xlsx)。
  • 讀寫速度:
    • xlrd/xlwt 在讀寫方面的速度都要優於 openpyxl。
  • 文件大小:
    • xlrd/xlwt:對單個 sheet 不超過 65535 行。
    • openpyxl:對文件大小沒有限制。

所以想要盡量提高效率又不影響結果時,可以考慮用 xlrd 讀取,用 openpyxl 寫入。

 

2.具體示例

具體的使用流程如下:

  1. 導入 openpyxl 模塊;
  2. 調用 openpyxl.load_workbook() 函數或 openpyxl.Workbook(),取得 Workbook 對象;
  3. 調用 get_active_sheet() 或 get_sheet_by_name() 工作簿方法,取得 Worksheet 對象;
  4. 使用索引或工作表的 cell() 方法,帶上 row 和 column 關鍵字參數,取得 Cell 對象,讀取或編輯 Cell 對象的 value 屬性。

 

2.1 獲取 workbook 與 sheet 對象

 創建新文件

 1 from openpyxl import Workbook
 2 
 3 # 創建工作簿對象
 4 wb = Workbook()
 5 
 6 # 激活sheet;拿到當前文件對象中默認操作的一個sheet,如上次關閉文件時所打開的sheet
 7 ws = wb.active
 8 # 表格在被創建的時候會自動的有一個名字。它們被命名在一個隊列中(sheet, ...),可以使用title屬性在任何時候來改變它們的名字。
 9 ws.title = "tmp"
10 
11 # 刪除sheet
12 wb.remove(ws)
13 
14 # 創建sheet
15 ws1 = wb.create_sheet("tmp1")  # 默認在最后插入新sheet
16 ws2 = wb.create_sheet("tmp2", 0)  # 在索引為0的位置插入
17 
18 # 保存文件(覆蓋同名文件的全部內容)
19 wb.save("文件名稱.xlsx")

打開已有文件

 1 # 打開已有文件
 2 from openpyxl import load_workbook
 3 
 4 # 打開指定文件
 5 wb = load_workbook("e:\\test.xlsx")
 6 
 7 # 查看所有sheet名
 8 print(wb.sheetnames)  # 返回列表
 9 # 遍歷所有sheet名
10 for sheet in wb.sheetnames:
11     print(sheet.title())
12 
13 # 選擇sheet
14 ws3 = wb["tmp3"]  # 方法1:名稱可以作為key進行查找
15 ws4 = wb.get_sheet_by_name("tmp4")  # 方法2
16 print(ws3 is ws4)  # True
17 
18 # 在原有內容上進行修改並保存
19 wb.save("e:\\test.xlsx")

 

2.2 訪問單元格及其值

注意:當一個工作表在內存中被創建時,它里面默認是沒有表格對象的,它們只有在第一次被訪問的時候才會被創建,從而減少內存占用。因為這個特性,我們要循環表格而不是直接訪問它們,這樣會將所有的表格對象在內存中創建,就算你沒有訪問它們中的任何一個值。

openpyxl 讀寫單元格時,單元格的坐標位置起始值是(1,1),即下標最小值為1。

訪問單個單元格

 1 # 獲取最大行列(返回數值)
 2 print(ws3.max_row)
 3 print(ws3.max_column)
 4 
 5 # 方法1:指定行列
 6 print(ws3["A2"].value)
 7 
 8 # 方法2:指定行列
 9 print(ws3.cell(row=2, column=2).value) # 行號和列號從1開始 10 
11 # 方法3:只要訪問就會創建對應單元格對象
12 for i in range(1, 10):
13     for j in range(1, 10):
14         print(ws4.cell(i, j).value)

行列序號轉換

1 from openpyxl.utils import get_column_letter, column_index_from_string
2 
3 # 根據列的數字返回字母
4 print(get_column_letter(2))  # B
5 # 根據字母返回列的數字
6 print(column_index_from_string('D'))  # 4

訪問多個單元格

 1 # 訪問指定行數據
 2 
 3 print(ws3[1])  # 方法1:索引從1開始
 4 print(ws3[1:3])  # 切片方式,返回二維元組
 5 print(tuple(ws3.rows)[1])  # 方法2:索引從0開始,sheet.rows為生成器, 里面是每一行的數據,每一行又由一個tuple包裹
 6 # 遍歷獲取每個單元格的值
 7 for cell in ws3[1]:
 8     print(cell.value)
 9 
10 
11 # 訪問指定列數據
12 
13 print(ws3["A"])
14 print(tuple(ws3.columns)[1])  # 訪問第2列單元格
15 print(ws3["A:C"])  # 返回二維元組
16 
17 
18 # 指定范圍
19 
20 # 方法1
21 print(ws3["A1:B4"])
22 # 方法2:最多訪問兩行兩列的單元格
23 for row in ws3.iter_rows(min_row=1, max_row=2, max_col=2): # 行號和列號從1開始 24     for cell in row:
25         print(cell)
26 '''執行結果:
27 <Cell 'tmp3'.A1>
28 <Cell 'tmp3'.B1>
29 <Cell 'tmp3'.A2>
30 <Cell 'tmp3'.B2>
31 '''
32 
33 for row in ws3.iter_cols(min_row=1, max_row=2, max_col=2): # 行號和列號從1開始 34     for cell in row:
35         print(cell)
36 '''注意與上述iter_rows的獲取順序不同
37 <Cell 'tmp3'.A1>
38 <Cell 'tmp3'.A2>
39 <Cell 'tmp3'.B1>
40 <Cell 'tmp3'.B2>
41 '''

矩陣置換

 1 rows = [
 2     ['Number', 'data1', 'data2'],
 3     [2, 40, 30],
 4     [3, 40, 25],
 5     [4, 50, 30],
 6     [5, 30, 10],
 7     [6, 25, 5],
 8     [7, 50, 10]]
 9 print(list(zip(*rows)))  # 傳入二維序列時需要解包
10 '''執行結果:
11 [('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50), ('data2', 30, 25, 30, 10, 5, 10)]
12 '''
13 
14 # 注意:該方法會舍棄缺少數據的列(行)
15 a1 = [1, 2]
16 a2 = [4, 5, 6]
17 print(list(zip(a1, a2)))
18 '''執行結果:
19 [(1, 4), (2, 5)]
20 '''

 

2.3 寫數據

寫入單元格值

 1 # 寫入常規值
 2 
 3 # 方法1
 4 ws3["A1"] = 1
 5 # 方法2:行號和列號從1開始
 6 ws3.cell(row=2, column=2, value="A2")
 7 # 方法3:追加一行數據(即最下方空白處的最左第一個單元格開始)
 8 ws3.append([1, 2, 3])
 9 
10 
11 # 寫時間
12 import time
13 
14 # 方法1
15 now_time_1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
16 ws3.cell(row=1, column=1, value=now_time_1)
17 
18 # 方法2
19 import locale
20 locale.setlocale(locale.LC_ALL, 'en')
21 locale.setlocale(locale.LC_CTYPE, 'chinese')
22 now_time_2 = time.strftime("%Y年%m月%d日 %H:%M:%S")  # 自動傳入當前時間
23 ws3.cell(row=1, column=2, value=now_time_2)

合並單元格

合並單元格以合並區域的左上角的那個單元格為基准,覆蓋其他單元格,使之稱為一個大的單元格。

相反,拆分單元格后將這個大單元格的值返回到原來的左上角位置。

1 ws3.merge_cells('A1:B1')  # 合並一行中的幾個單元格
2 ws3.merge_cells('B2:C11')  # 合並一個矩形區域中的單元格

合並后只可以往左上角寫入數據,也就是區間中最左上角的坐標。

如果這些要合並的單元格都有數據,只會保留左上角的數據,其他則丟棄。換句話說若合並前不是在左上角寫入數據,那么合並后的單元格則不會有數據。

拆分單元格

1 ws3.unmerge_cells('A1:B1')  # 拆分后,值回寫到A1位置
2 ws3.unmerge_cells('B2:C11')  # 拆分后,值回寫到B2位置

 

2.4 設置樣式

sheet標簽顏色

1 ws3.sheet_properties.tabColor = "1072BA"

效果:

行高與列寬

1 # 第2行行高
2 ws3.row_dimensions[2].height = 40
3 # C列列寬
4 ws3.column_dimensions['C'].width = 30

單元格樣式

1 '''字體'''
2 # 等線24號,加粗斜體,字體顏色紅色
3 bold_italic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)
4 # 直接使用cell的font屬性,將Font對象賦值給它
5 ws3['A1'].font = bold_italic_24_font
6 
7 '''對齊方式'''
8 # 設置B1中的數據垂直居中和水平居中(除了center,還可以使用right、left等參數)
9 ws3['B1'].alignment = Alignment(horizontal='center', vertical='center')

 


免責聲明!

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



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