python+excel=openpyxl(一)

新夢想IT發表於2022-12-20



原計劃寫一個openpyxl的操作文件,普及下python如何來操作excel,結果人家官方的文件已經寫的非常


完美了,就臨時改主意把人家的文件翻譯了一遍。可以閱讀英文文件的同學,建議大家直接去看官方的


API操作文件


官網地址:Openpyxl



建立一個excel檔案


使用openpyxl模組工作時,我們並需要在系統檔案中建立一個excel檔案。只需要匯入Workbook類就可以


了:


>>> from openpyxl import Workbook

>>> wb = Workbook()

一個excel檔案總是會自動建立至少一張表,也就是所謂的sheet

新夢想技術分享

你可以透過使用命令Workbook物件名.active來獲取這張sheet


>>> ws = wb.active

注意:active預設獲取下標0的表。除非你自行指定了下標,否則你將永遠都只能獲取到第一張表。


你可以使用命令Workbook物件.create_sheet()來建立sheet表單:


>>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)

# or

>>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position

# or

>>> ws3 = wb.create_sheet("Mysheet", -1) # insert at the penultimate position


自行建立的sheet表單都會自動的生成一個名字。類似與sheet、sheet1、sheet2…你隨時都可以修改這


個名字,只要透過屬性title:


wb.title = ‘new title’


預設情況下,改標題表單下的表格是白色的。你可以透過屬性:表單物件.sheet_properties.tabColor


來設定


ws.sheet_properties.tabColor = "1072BA"


一旦你定義了sheet表單的標題之後,你就可以將其作為workbook物件的key來進行呼叫:


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


透過sheetname屬性你可以瀏覽workbook物件下所有sheet表單的標題


>>> print(wb.sheetnames)

['Sheet2', 'New Title', 'Sheet1']


你也可以迴圈遍歷所有的sheet表單




>>> for sheet in wb:

...     print(sheet.title)


你可以在當前檔案中,建立sheet表單的副本


>>> source = wb.active

>>> target = wb.copy_worksheet(source)


注意:

只有單元格(包括值、樣式、超連結和註釋)和某些表格工作屬性(包括尺寸、格式和屬性)。不能復


制所有其他檔案/表單的屬性,比如:影像、圖表

也不能在工作簿之間賦值sheet表。如果工作簿是隻讀或者只寫的模式,那麼你也不能賦值它。



運算元據


訪問一個單元格


現在我們已經知道了如何取獲取一個sheet表單,現在可以開始修改表單中單元格的內容了。單元格可以


作為表單的key來直接訪問


>>> c = ws['A4']




上面命令將會返回A4單元格,如果A4不存在的話,那命令執行完成之後會自動建立一個。可以直接進行


賦值操作




>>> ws['A4'] = 4



openpyxl也提供了cell()函式。


這個函式可以透過行和列更精確的訪問單元格


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

 

注意:


記憶體中的sheet表不存在任何的單元格。所有你操作的單元格都是在訪問的同時建立的正是由於此特性,


所以即使你沒有給他們分配值,也可以透過滾動的瀏覽的方式在記憶體中建立單元格




類似於下列方法


>>> for x in range(1,101):

...        for y in range(1,101):

...            ws.cell(row=x, column=y)

這個程式碼塊將會建立一個100*100的單元格,但沒有什麼實際意義




訪問多個單元格


可以透過切片來訪問多個單元格


>>> cell_range = ws['A1':'C2']


也可以使用類似的方法來獲取行或者列的範圍


>>> colC = ws['C']

>>> col_range = ws['C:D']

>>> row10 = ws[10]

>>> row_range = ws[5:10]



你也可以使用iter_row()方法:


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



同樣使用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>



注意:


出於效能原因,Worksheet.iter_cols()方法在只讀模式下不可用。




如果你需要遍歷所有的行或者列的話,你可以使用row屬性或者columns屬性




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


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

 


注意:


處於效能原因的考慮,columns屬性在只讀模式下不可以用



僅獲取單元格的值


如果你只是想獲取sheet表單中的值的話,可以使用屬性valus。這將遍歷工作表中所有的行,但僅返回


單元格的值


for row in ws.values:

   for value in row:

     print(value)

 iter_rows()和iter_cols()函式透過引數 values_only也都可以之返回值



>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):

...   print(row)


(None, None, None)

(None, None, None)



資料儲存


一旦我們有了一個單元格之後,我們可以指定它的值


>>> c.value = 'hello, world'

>>> print(c.value)

'hello, world'


>>> d.value = 3.14

>>> print(d.value)

3.14




儲存到檔案


最簡單以及最安全的用來儲存workbook的方法,是透過使用workbook類物件的save()方法


>>> wb = Workbook()

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


注意:

此操作將會重寫已存在的檔案內容,並且不會給出警告

檔名副檔名不是強制為xlsx或xlsm,如果你不使用官方副檔名,那你可能無法透過其他應用程式直接


開啟此檔案。

由於OOXML檔案基本上是ZIP檔案,因此您也可以使用自己喜歡的ZIP存檔管理器將其開啟。



儲存為流


如果你想將檔案儲存到流物件中,比如,在你使用一些像Pyramid、Flask或者Django這樣的web框架時,


你只需要透過一個NameTemporaryFile()物件

>>> from tempfile import NamedTemporaryFile

>>> from openpyxl import Workbook

>>> wb = Workbook()

>>> with NamedTemporaryFile() as tmp:

        wb.save(tmp.name)

        tmp.seek(0)

        stream = tmp.read()



你可以設定屬性template=True,將workbook物件儲存為一個模板


>>> wb = load_workbook('document.xlsx')

>>> wb.template = True

>>> wb.save('document_template.xltx')


或者將屬性設定為False(預設值),將workbook物件儲存為一個檔案

>>> wb = load_workbook('document_template.xltx')

>>> wb.template = False

>>> wb.save('document.xlsx', as_template=False)


載入已有的檔案

與建立檔案相同,透過openpyxl.load_workbook()可以開啟一個現有的檔案

>>> from openpyxl import load_workbook

>>> wb2 = load_workbook('test.xlsx')

>>> print wb2.sheetnames

['Sheet2', 'New Title', 'Sheet1']


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2928748/,如需轉載,請註明出處,否則將追究法律責任。

相關文章