python第三方庫之openpyxl(1)


python第三方庫之openpyxl(1)

簡介

Openpyxl是一個用於讀寫Excel 2010 xlsx/xlsm/xltx/xltm文件的Python庫,其功能非常強大。Excel表格可以理解為一個二維矩陣,行用1,2,3,4,5.....等表示,在Openpyxl可以用來作為行索引。列用A,B,C,D,E,F.......表示,在Openpyxl中可以用來當做列索引,描述一個單元格的位置需要一個行標、一個列標。如A1表示第一行第一列對應的單元格,E4表示第四行第五列對應的單元格。

簡單示例:

from openpyxl import Workbook
wb = Workbook()                         # 實例化一個工作簿對象

# 獲取當前活躍的工作簿
ws = wb.active

# 數據可以直接分配給具體單元格
ws['A1'] = 42

# 行也可以被追加
ws.append([1, 2, 3])

# Python類型將自動轉換
import datetime
ws['A2'] = datetime.datetime.now()

# 保存成Excel文件
wb.save("sample.xlsx")    

用法示例

在內存中操作工作簿

沒有必要在文件系統上創建一個文件來使用openpyxl,直接導入Workbook類就可以使用它

>>> from openpyxl import Workbook
>>> wb = Workbook() # 實例化一個工作簿對象

 

Workbook()類通常至少創建一個工作表,可以使用active()方法獲得當前活躍的工作簿

>>> ws = wb.active

注意:這個函數使用_active_sheet_index屬性,默認設置為0。除非您修改它的值,否則您將總是使用這個方法獲得第一個工作表。

也可以用openpyxl.workbook.Workbook.create_sheet()方法創建新的工作簿

>>> ws1 = wb.create_sheet("Mysheet") # 默認在末尾插入
# or
>>> ws2 = wb.create_sheet("Mysheet", 0) # 在第一個位置插入

表格在創建的時候就會自動的按照順序以(Sheet, Sheet1, Sheet2, …)的方式命名,你隨時都可以用title屬性來改變表格的名稱

ws.title = "New Title"

在默認情況下,持有這個標題的標簽的背景顏色是白色的。你可以通過給sheet_properties.tabColor屬性賦一個RRGGBB值來改變它。

ws.sheet_properties.tabColor = "1072BA"

一旦你給了一個工作表一個名字,你就可以把它作為一個鍵來獲取這個工作簿

>>> ws3 = wb["New Title"]

您可以通過openpyxl.workbook.Workbook.sheetnames()方法查看工作簿的所有工作表的名稱

>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']

你也可以循工作表

>>> for sheet in wb:
...     print(sheet.title)

你可以用openpyxl.workbook.Workbook.copy_worksheet()方法在一個工作簿中創建工作表的副本

>>> source = wb.active
>>> target = wb.copy_worksheet(source)

注意:只有單元格(包括值、樣式、超鏈接和注釋)和某些工作表屬性(包括維度、格式和屬性)被復制。所有其他工作簿/工作表屬性都不會被復制——例如圖像、圖表。

你不能在工作簿之間復制工作表。如果工作簿是以只讀或寫方式打開的,那么您也不能復制工作表。

玩轉數據

現在我們知道了如何訪問工作表,我們可以開始修改單元內容

可以直接以工作表鍵的方式來訪問單元格

>>> c = ws['A4']

上面可以返回一個A4單元格,如果A4單元格不存在,就會創建一個。可以直接分配值。

>>> ws['A4'] = 4

同時還有一個openpyxl.worksheet.Worksheet.cell()方法,這提供了使用行和列表示法訪問單元格的方法。

>>> d = ws.cell(row=4, column=2, value=10)

注意:當一個工作表在內存中創建時,它不包含任何單元格。它們是在第一次訪問時創建的。由於這個特性,滾動瀏覽單元而不是直接訪問它們將在內存中創建它們,即使您沒有給它們賦值。

例如:

>>> for i in range(1,101):
...        for j in range(1,101):
...            ws.cell(row=i, column=j)

將在內存中創建100x100個單元格,什么都不做。

 

訪問多個單元格

可以使用切片來訪問單元格范圍

>>> cell_range = ws['A1':'C2']  #獲取A1到C2之間的單元格

行或列的范圍也可以得到類似的結果

>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]

也可以使用openpyxl.worksheet.Worksheet.iter_rows()方法

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...    for cell in row:
...        print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>

除此之外openpyxl.worksheet.Worksheet.iter_cols()方法可以返回列

>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
...     for cell in col:
...         print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>

如果您需要遍歷文件的所有行或列,您可以使用openpyxl.worksheet.Worksheet.rows()方法

>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

或者openpyxl.worksheet.Worksheet.columns()方法

>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))

數據存儲

一旦我們有了openpyxl.cell.Cell類,我們可以給它賦值

>>> c.value = 'hello, world'
>>> print(c.value)
'hello, world'

>>> d.value = 3.14
>>> print(d.value)
3.14

你也可以啟用類型和格式推斷

>>> wb = Workbook(guess_types=True)
>>> c.value = '12%'
>>> print(c.value)
0.12

>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print d.value
datetime.datetime(2010, 9, 10, 22, 25, 18)

>>> c.value = '31.50'
>>> print(c.value)
31.5

保存到一個文件

最簡單和最安全的保存工作簿的方法是調用openpyxl.workbook.Workbook對象的openpyxl.workbook.Workbook.save()方法

>>> wb = Workbook()
>>> wb.save('balances.xlsx')

警告:這個操作將在沒有警告的情況下覆蓋現有的文件。

擴展並不一定是xlsx或xlsm,如果您不使用官方擴展,直接用另一個應用程序打開它,您可能會遇到一些麻煩。

由於OOXML文件基本上是ZIP文件,所以您也可以用.ZIP結束文件名,並使用您最喜歡的ZIP歸檔管理器打開它。

你可以指定屬性template=True,以保存工作簿作為模板。

>>> wb = load_workbook('document.xlsx')
>>> wb.template = True
>>> wb.save('document_template.xltx')

或者將該屬性設置為False(缺省值),以保存為文檔

>>> wb = load_workbook('document_template.xltx')
>>> wb.template = False
>>> wb.save('document.xlsx', as_template=False)

注意:您應該監視數據屬性和文檔擴展,以便在文檔模板中保存文檔,反之亦然,否則結果表引擎不能打開文檔

以下將會導致錯誤

>>> wb = load_workbook('document.xlsx')
>>> # 需要用 *.xlsx擴展名保存
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打開文檔
>>>
>>> # or
>>>
>>> # 需要指定屬性keep_vba = True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打開文檔
>>>
>>> # or
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # 如果我們需要一個模板文檔,那么我們必須指定擴展為.xltm
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打開文檔

從文件加載

和寫一樣,您可以導入openpyxl.load workbook()來打開現有的工作簿

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

 


免責聲明!

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



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