簡介Openpyxl是一個用于讀寫Excel 2010 xlsx/xlsm/xltx/xltm文件的Python庫,,其功能非常強大。Excel表格可以理解為一個二維矩陣,,行用1,2,3,4,5.....等表示,在Openpyxl可以用來作為行索引,。列用A,B,C,D,E,F.......表示,,在Openpyxl中可以用來當做列索引,描述一個單元格的位置需要一個行標,、一個列標,。如A1表示第一行第一列對應(yīng)的單元格,E4表示第四行第五列對應(yīng)的單元格,。 簡單示例:from openpyxl import Workbook wb = Workbook() # 實例化一個工作簿對象 # 獲取當前活躍的工作簿 ws = wb.active # 數(shù)據(jù)可以直接分配給具體單元格 ws['A1'] = 42 # 行也可以被追加 ws.append([1, 2, 3]) # Python類型將自動轉(zhuǎn)換 import datetime ws['A2'] = datetime.datetime.now() # 保存成Excel文件 wb.save("sample.xlsx") 用法示例在內(nèi)存中操作工作簿沒有必要在文件系統(tǒng)上創(chuàng)建一個文件來使用openpyxl,,直接導入Workbook類就可以使用它 >>> from openpyxl import Workbook >>> wb = Workbook() # 實例化一個工作簿對象
Workbook()類通常至少創(chuàng)建一個工作表,可以使用active()方法獲得當前活躍的工作簿 >>> ws = wb.active 注意:這個函數(shù)使用_active_sheet_index屬性,,默認設(shè)置為0,。除非您修改它的值,否則您將總是使用這個方法獲得第一個工作表,。 也可以用openpyxl.workbook.Workbook.create_sheet()方法創(chuàng)建新的工作簿 >>> ws1 = wb.create_sheet("Mysheet") # 默認在末尾插入 # or >>> ws2 = wb.create_sheet("Mysheet", 0) # 在第一個位置插入 表格在創(chuàng)建的時候就會自動的按照順序以(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()方法在一個工作簿中創(chuàng)建工作表的副本 >>> source = wb.active >>> target = wb.copy_worksheet(source) 注意:只有單元格(包括值,、樣式,、超鏈接和注釋)和某些工作表屬性(包括維度、格式和屬性)被復制,。所有其他工作簿/工作表屬性都不會被復制——例如圖像,、圖表。 你不能在工作簿之間復制工作表,。如果工作簿是以只讀或?qū)懛绞酱蜷_的,,那么您也不能復制工作表。 玩轉(zhuǎn)數(shù)據(jù)現(xiàn)在我們知道了如何訪問工作表,,我們可以開始修改單元內(nèi)容 可以直接以工作表鍵的方式來訪問單元格 >>> c = ws['A4'] 上面可以返回一個A4單元格,,如果A4單元格不存在,就會創(chuàng)建一個,??梢灾苯臃峙渲怠?/p> >>> ws['A4'] = 4 同時還有一個openpyxl.worksheet.Worksheet.cell()方法,這提供了使用行和列表示法訪問單元格的方法,。 >>> d = ws.cell(row=4, column=2, value=10) 注意:當一個工作表在內(nèi)存中創(chuàng)建時,,它不包含任何單元格。它們是在第一次訪問時創(chuàng)建的,。由于這個特性,,滾動瀏覽單元而不是直接訪問它們將在內(nèi)存中創(chuàng)建它們,即使您沒有給它們賦值,。 例如: >>> for i in range(1,101): ... for j in range(1,101): ... ws.cell(row=i, column=j) 將在內(nèi)存中創(chuàng)建100x100個單元格,,什么都不做。
訪問多個單元格可以使用切片來訪問單元格范圍 >>> cell_range = ws['A1':'C2'] #獲取A1到C2之間的單元格 行或列的范圍也可以得到類似的結(jié)果 >>> 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>)) 數(shù)據(jù)存儲一旦我們有了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 保存到一個文件最簡單和最安全的保存工作簿的方法是調(diào)用openpyxl.workbook.Workbook對象的openpyxl.workbook.Workbook.save()方法 >>> wb = Workbook() >>> wb.save('balances.xlsx') 警告:這個操作將在沒有警告的情況下覆蓋現(xiàn)有的文件,。 擴展并不一定是xlsx或xlsm,,如果您不使用官方擴展,直接用另一個應(yīng)用程序打開它,,您可能會遇到一些麻煩,。 由于OOXML文件基本上是ZIP文件,所以您也可以用.ZIP結(jié)束文件名,,并使用您最喜歡的ZIP歸檔管理器打開它,。 你可以指定屬性template=True,以保存工作簿作為模板,。 >>> wb = load_workbook('document.xlsx') >>> wb.template = True >>> wb.save('document_template.xltx') 或者將該屬性設(shè)置為False(缺省值),,以保存為文檔 >>> wb = load_workbook('document_template.xltx') >>> wb.template = False >>> wb.save('document.xlsx', as_template=False) 注意:您應(yīng)該監(jiān)視數(shù)據(jù)屬性和文檔擴展,以便在文檔模板中保存文檔,,反之亦然,,否則結(jié)果表引擎不能打開文檔 以下將會導致錯誤 >>> 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()來打開現(xiàn)有的工作簿 >>> from openpyxl import load_workbook >>> wb2 = load_workbook('test.xlsx') >>> print wb2.get_sheet_names() ['Sheet2', 'New Title', 'Sheet1']
|
|