Python openpyxl 處理Excel使用指南
這是一份openpyxl的使用指南。本文講述如何使用openpyxl處理Excel文件。
創建工作本
workbook指的就是Excel文件。使用openpyxl并不需要你在電腦上自己創建文件。直接引入Workbook類就可以開始工作。
>>> from openpyxl import Workbook >>> wb = Workbook()
至此一個至少有1個工作表的工作本已經被創建了。你可以通過Workbook.active屬性來獲取到工作表。
>>> ws = wb.active
注意:
默認工作表序號是被設置成0的。除非你修改了這個值,否則用這個方法獲取到的都是第一張表。
可以通過 Workbook.create_sheet() 方法來創建新的工作表
>>> ws1 = wb.create_sheet("Mysheet") # 默認在后面插入一張新表 # 或者 >>> ws2 = wb.create_sheet("Mysheet", 0) # 在第一位插入新表 # 或者 >>> ws3 = wb.create_sheet("Mysheet", -1) # 在倒數第二的位置插入表
工作表被創建的時候會自動命名,名字是以數字序列來排的(例如Sheet, Sheet1, Sheet2, …)。
可以使用 Worksheet.title 來修改工作表的名字。
ws.title = "New Title"
默認情況下,工作表名字的標題顏色是白色的。
賦予RGB值 Worksheet.sheet_properties.tabColor 來修改顏色。
ws.sheet_properties.tabColor = "1072BA"
當你命名了工作表后,也可以通過名字來獲取到這張表。
>>> ws3 = wb["New Title"]
查看工作本中所有表格的名字,使用 Workbook.sheetname 屬性。
>>> print(wb.sheetnames) ['Sheet2', 'New Title', 'Sheet1']
循環打印名字
>>> for sheet in wb: ... print(sheet.title)
在同一個工作本(Excel文件)中,可以使用 Workbook.copy_worksheet() 復制表格。
>>> source = wb.active >>> target = wb.copy_worksheet(source)
注意
只有單元格(包括數值,風格,超鏈接和注釋)和確定的工作表屬性(包括尺寸,格式和屬性)可以被復制。
工作表其他的內容是不能復制的,比如圖片,圖表等。
也可以在不同的Excel文件中復制表格。如果Excel文件是只讀或只寫的,就不能復制表格。
處理數據
單元格
現在我們知道來如何獲取到工作表。我們可以開始修改單元格數據了。
用單元格的坐標可以獲取到單元格。
>>> c = ws['A4']
返回的是A4單元格。如果之前A4不存在,則會創建A4單元格。
給單元格傳入數據,直接賦值
>>> ws['A4'] = 4
我們也可以用 Worksheet.cell() 方法,通過行列序號的方式來拿到單元格。
>>> d = ws.cell(row=4, column=2, value=10)
注意
如果工作表是在內存中創建的,它是不包含單元格的。第一次獲取單元格時會先創建單元格。
警告:因為這個特性,就算是沒給單元格賦值,遍歷的時候會直接在內存中創建它們。
例如
>>> for x in range(1,101): ... for y in range(1,101): ... ws.cell(row=x, column=y)
會在內存中創建 100x100 個沒有值的單元格。
處理多個單元格
獲取一個范圍內的多個單元格。
>>> cell_range = ws['A1':'C2']
獲取行或列的單元格
>>> colC = ws['C'] >>> col_range = ws['C:D'] >>> row10 = ws[10] >>> row_range = ws[5:10]
也可以用 Worksheet.iter_rows() 方法
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2): ... for cell in row: ... print(cell)
類似的 Worksheet.iter_cols() 也會返回列單元格
>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2): ... for cell in col: ... print(cell)
注意:性能原因 Worksheet.iter_cols() 方法在只讀模式下不能使用。
如果你需要遍歷文件中的所有行列,可以使用Worksheet.rows
>>> ws = wb.active >>> ws['C9'] = 'hello world' >>> tuple(ws.rows) ((
或者是Worksheet.columns屬性
>>> tuple(ws.columns) ((
注意:基于性能方面的考慮,Worksheet.columns在只讀模式中不能使用。
讀取數據
如果只是要讀取表中的數據,可以使用 Worksheet.values。它會返回表中所有行的單元格的值。
for row in ws.values: for value in row: print(value)
Worksheet.iter_rows() 和 Worksheet.iter_cols() 都可以獲取到單元格的值。
>>> 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.save()。
wb = Workbook() wb.save('balances.xlsx')
注意,這個方法會在沒有警告的情況下覆蓋已有的文件。
文件擴展名并沒有被限制為xlsx或xlsm。
存儲成為流(stream)
如果要把文件存成流,例如web應用Pyramid, Flask 或者Django,提供一個NamedTemporaryFile()即可
>>> 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
>>> wb = load_workbook('document.xlsx') >>> wb.template = True >>> wb.save('document_template.xltx')
設template為False,即保存為文檔。
>>> wb = load_workbook('document_template.xltx') >>> wb.template = False >>> wb.save('document.xlsx', as_template=False)
注意:在保存文檔的時候應該注意文件擴展名,比如.xltx和.xlsx。以防后面用其他軟件打開的時候遇到麻煩。
接下來的這些是錯誤操作
>>> wb = load_workbook('document.xlsx') >>> # 需要存儲成*.xlsx文件 >>> wb.save('new_document.xlsm') >>> # MS Excel 將無法打開這個文件 >>> >>> # 或者 >>> >>> # 需要指定 keep_vba=True >>> wb = load_workbook('document.xlsm') >>> wb.save('new_document.xlsm') >>> # MS Excel 將無法打開這個文件 >>> >>> # 或者 >>> >>> 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.sheetnames ['Sheet2', 'New Title', 'Sheet1']
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。