Python處理Excel文檔之openpyxl


openpyxl 可以很好的處理 2010版本以上的表格。

示例:

 1 #coding:utf8
 2 '''
 3 Created on 2018年8月18日
 4 
 5 @author: Administrator
 6 '''
 7 from openpyxl import Workbook
 8 import datetime
 9 wb = Workbook()
10 
11 # grab the active worksheet
12 ws = wb.active
13 
14 # Data can be assigned directly to cells
15 ws['A1'] = "班級人員統計表"
16 
17 # Rows can also be appended
18 list_str=["記錄時間","學號","姓名","性別","年齡"]
19 ws.append(list_str)
20 
21 list_str2=["1","諸葛亮","","89"]
22 time1=datetime.date.today()
23 list_str2.insert(0, time1)
24 ws.append(list_str2)
25 
26 # 如果你要在已經有的數據上進行修改,會自動覆蓋掉,原有的數據
27 # import datetime
28 # ws['A2'] = datetime.datetime.now()
29 
30 # Save the file
31 wb.save("sample.xlsx")


在內存中處理一個工作簿:

創建一個工作簿

沒有必要利用 openpyxl 先去創建一個文件系統上的文件然后才能開始使用。你只要導入工作簿類,然后開始使用它吧。

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

A workbook is always created with at least one worksheet. You can get it by using the  openpyxl.workbook.Workbook.active()  property

一個工作簿被創建后,總會在里面默認創建一張工作表。你可以通過使用方法 openpyxl.workbook.Workbook.active() 來得到它。

 ws = wb.active

  默認狀態下,函數 the _active_sheet_index property 的 index設置為0,除非你手動修改它的數值,否則的話,你用這個方法,只會拿到第一個工作表。

 1 @property
 2     def active(self):
 3         """Get the currently active sheet or None
 4 
 5         :type: :class:`openpyxl.worksheet.worksheet.Worksheet`
 6         """
 7         try:
 8             return self._sheets[self._active_sheet_index]
 9         except IndexError:
10             pass
11 
12     @active.setter
13     def active(self, value):
14         """Set the active sheet"""
15         self._active_sheet_index = value
16 
17     def create_sheet(self, title=None, index=None):
18         """Create a worksheet (at an optional index).
19 
20         :param title: optional title of the sheet
21         :type title: unicode
22         :param index: optional position at which the sheet will be inserted
23         :type index: int
24 
25         """
26         if self.read_only:
27             raise ReadOnlyWorkbookException('Cannot create new sheet in a read-only workbook')
28 
29         if self.write_only :
30             new_ws = WriteOnlyWorksheet(parent=self, title=title)
31         else:
32             new_ws = Worksheet(parent=self, title=title)
33 
34         self._add_sheet(sheet=new_ws, index=index)
35         return new_ws
View Code

 

可以通過 openpyxl.workbook.Workbook.create_sheet() 方法,創建工作表。

wb.create_sheet("mysheet", 1)
wss=wb.create_sheet()

ws1 = wb.create_sheet("Mysheet111") # insert at the end (default)
ws2 = wb.create_sheet("Mysheet222", 0) # insert at first position

工作表的名字是自動命令。按照列表(Sheet, Sheet1, Sheet2, …)的內容,順序命名。你也可以自定義工作表名字。

ws.title = "New Title"

默認情況下,包含此標題的選項卡的背景顏色為白色。您可以將此更改為為 sheet_properties 提供RRGGBB顏色代碼。 tabColor 屬性:

ws.sheet_properties.tabColor = "1072BA"

 一旦你給一個工作表命名一個名字,你就可以把這個名字作為一個鍵去訪問工作簿中的工作表:

ws3 = wb["New Title"]

 你也可以通過方法 openpyxl.workbook.Workbook.sheetnames() 去遍歷,查看工作簿中左右工作表的名稱。

查看工作表:

print(wb.sheetnames)

  結果:

['Sheet', 'mystudent']

遍歷工作表:

1 for sheetname in wb:
2     print(sheetname.title)

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

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

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

               2、您不能在工作簿之間復制工作表。如果工作簿以只讀或只讀模式打開,您也不能復制工作表。

把玩數據

操作單一單元格

我們已經知道如何從外部進去工作表了。現在就可以對工作表里面的單元格內容進行各種操作了。

單元格可以作為工作表的鍵直接訪問

 c = ws['A4']

這將返回A4大小的單元格,或者如果單元格還不存在,就創建一個單元格。值可以直接分配

ws['A4'] = 4

當然,你也可以通過方法 openpyxl.worksheet.Worksheet.cell() 去訪問。該方法通過行和列的索引去訪問,並且可以進行賦值操作。

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

當一個工作表在內存中被創建的時候,他是不包含單元格。單元格只有在初次使用的時候,才會被創建。所以,當你訪問一個不存在的單元格時,會報錯。out of ranges

注意:由於這個特性,在內存中,當單元格沒有值得時候,而需要訪問它們,我們可以利用滾動訪問的方式替代直接訪問的方式。 

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

 以上代碼會創建一個100*100的空白單元格。

批量操作單元格

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

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 'mystudent'.A1>
<Cell 'mystudent'.B1>
<Cell 'mystudent'.C1>
<Cell 'mystudent'.A2>
<Cell 'mystudent'.B2>
<Cell 'mystudent'.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>

如果需要遍歷文件的所有行或列,可以使用 openpyxpath .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
 1 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
 2 Type "copyright", "credits" or "license()" for more information.
 3 >>> import openpyxl
 4 >>> wb=openpyxl.Workbook()
 5 >>> ws=wb.create_sheet()
 6 >>> ws.title="mystudent"
 7 >>> ws.sheet_properties.tabColor="1072BA"
 8 >>> c=ws['A4']
 9 >>> d=ws.cell(row=4,column=2,value=10)
10 >>> c.value="中國"
11 >>> c
12 <Cell 'mystudent'.A4>
13 >>> print(c.value)
14 中國
15 >>> d.value
16 10
17 >>> d.value=3.1415926
18 >>> print(d.value)
19 3.1415926
20 >>> 
View Code

你也可以使用類型和格式。 注意::guess_types=True  測試使用,暫時用不了。會報錯。沒有這個參數。python37

 1 >>> wb = Workbook(guess_types=True)
 2 >>> c.value = '12%'
 3 >>> print(c.value)
 4 0.12
 5 
 6 >>> import datetime
 7 >>> d.value = datetime.datetime.now()
 8 >>> print d.value
 9 datetime.datetime(2010, 9, 10, 22, 25, 18)
10 
11 >>> c.value = '31.50'
12 >>> print(c.value)
13 31.5

保存文件

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

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

  注意:如果文件名為已有的文件名,此操作將在沒有任何警告的情況下覆蓋現有文件。

您可以指定屬性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')
>>> # Need to save with the extension *.xlsx
>>> wb.save('new_document.xlsm')
>>> # MS Excel can't open the document
>>>
>>> # or
>>>
>>> # Need specify attribute keep_vba=True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # MS Excel will not open the document
>>>
>>> # or
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # If we need a template document, then we must specify extension as *.xltm.
>>> wb.save('new_document.xlsm')
>>> # MS Excel will not open the document

加載文件:

與編寫相同的方法是,可以導入 openpyxx .load_workbook() 來打開現有的工作簿:

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

 

簡單操作到此結束。

 


免責聲明!

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



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