python使用openpyxl操作execl


 

 

openpyxl

openpyxl可以用來對excel進行操作,但只能操作xlsx文件而不能操作xls文件。

主要用到三個概念:Workbooks,Sheets,Cells。
Workbook就是一個excel工作薄;
Sheet是工作表中的一張工作表;
Cell就是簡單的一個格。
openpyxl就是圍繞着這三個概念進行的:打開Workbook,定位Sheet,操作Cell。

 

讀取與創建

讀取Workbooks

可以導入openpyxl.load_workbook()來打開一個已經存在的workbook:

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

 

創建Workbooks與Sheets

在剛開始使用openpyxl的時候,不需要直接在文件系統中創建一個文件,僅僅需要導入Workbook類並開始使用它:

>>> from openpyxl import Workbook
>>> wb = Workbook()

一個workbook總是會創建至少一個worksheet(工作表),可以通過openpyxl.workbook.Workbook.active()這個屬性去獲取:

>>> ws = wb.active

這個函數使用_active_sheet_index這個屬性,默認設置的值是0,除非你指定一個值,否則總是獲取到第一個worksheet。

你可以使用openpyxl.workbook.Workbook.create_sheet()來創建一個新的worksheet:

>>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)# or
>>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position

當創建腳標的時候會自動創建一個名字,按照(Sheet, Sheet1, Sheet2, ...)這個列表名創建,你可以使用tiitle屬性來修改這個名字:

>>> ws.title = "New Title"

一旦給了一個worksheet名字,就可以通過一個key去獲取這個worksheet:

>>> 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()這個屬性復制一個worksheet:

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

注意:只有cells 和 styles能夠被復制,不能在workbooks之間復制worksheets,你可以在一個workbook中復制worksheets

 

數據操作

獲取一個cell

現在我們已經知道怎么訪問一個worksheet,我們可以開始修改cell的內容了。(一個cell就是一個單元格)
cell可以直接通過key來獲取:

>>> c = ws['A4']

這將會返回一個cell或創建一個不存在的cell。cell 的值可以直接被賦值:

>>> ws['A4'] = 4

也可以使用另外一個方法openpyxl.worksheet.Worksheet.cell():

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

Note:當在內存當中創建一個worksheet的時候,它沒有包含任何cell,當它們第一次被訪問的時候被創建

Warning:因為excel表的滾動特性,滾動出來的cell也會被創建出來,即使沒有訪問那些cell,例如:

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

這將會創建100*100個空的cell

訪問多個cell

使用切片可以訪問多個cell

>>> cell_range = ws['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.valuedatetime.datetime(2010, 9, 10, 22, 25, 18)
>>> c.value = '31.50'
>>> print(c.value)
31.5

 


保存到文件

最簡單和快速的保存一個workbook方法是使用openpyxl.workbook.Workbook模塊的openpyxl.workbook.Workbook.save()這個方法:

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

Warning:這個方法將會在沒有警告提示下覆蓋已經有的內容
可以使用template=True將一個workbook保存成一個模版:

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

*Warning:當保存文檔的時候在模版文檔中你應該注意文檔的擴展名(后綴名)和數據描述,否則可能會導致文檔不能被再次打開,如下錯誤式例:
注解 以下操作將失敗:

>>> wb = load_workbook('document.xlsx')
>>> # 應該保存成擴展名為*.xlsx
>>> wb.save('new_document.xlsm')
>>> # Excel軟件不能再次打開此文件
>>>
>>> # 或者
>>>
>>> # 應該指定屬性keep_vba=True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # Excel軟件不能再次打開此文件
>>>
>>> # 或者
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # 如果我們需要一個模版文件,就必須指定擴展名為 *.xltm.
>>> wb.save('new_document.xlsm')
>>> # Excel軟件不能再次打開此文件

 

 

 原文鏈接

 更多閱讀:

Working with Excel Spreadsheets

openpyxl簡單用法


免責聲明!

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



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