訪問單個單元格安全
c = ws['A4'] #返回單元格A4,若是單元格不存在,則會自動建立 ws['A4'] = 4 #爲單元格A4賦值爲4 d = ws.cell(row=4, column=2, value=10) #給單元格B4賦值爲10
當一個worksheet在內存中建立時,是不包含任何單元格的,只有當第一次訪問時纔會被建立
當經過cell()函數訪問大批量單元格時,這些單元格雖然沒有被賦值,但這些單元格卻已在內存中建立函數
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'] #訪問從A1到C2的全部單元格 colC = ws['C'] #訪問C列的全部單元格 col_range = ws['C:D'] #訪問C列和D列的全部單元格 row10 = ws[10] #訪問第10行的全部單元格 row_range = ws[5:10] #訪問第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) ''' 輸出: <Cell Sheet1.A1> <Cell Sheet1.B1> <Cell Sheet1.C1> <Cell Sheet1.A2> <Cell Sheet1.B2> <Cell Sheet1.C2> ''' #使用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> '''
出於性能方面的考慮,Worksheet.iter_cols()在read-only模式下是不可用的
我認爲這多是由於內存的大小是有限的,因爲沒法事先預估文件的大小,假如文件有一億行數據
則iter_cols方法在以列爲單位遍歷文件時,先遍歷第一列,可能遍歷到第一千萬行時,內存就已經不夠了spa
遍歷整個文件的全部行和列excel
能夠遍歷整個worksheet中的數據code
好比一個worksheet中數據,最大座標跨度爲,最大行數爲999,最大列爲AA,則遍歷的範圍將是A1:AA999blog
至關於在excel的worksheet中,進行ctrl+A的操做內存
ws['C9'] = 'hello world' tuple(ws.rows) #獲取A1到C9的全部單元格,以行爲單位 ''' 輸出: ((<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) #獲取A1到C9的全部單元格,以列爲單位 ''' 輸出: ((<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>)) '''
出於性能方面的考慮,Worksheet.columns在read-only模式下是不可用的文檔
單元格值處理
若是隻想處理單元格的值,可以使用屬性Worksheet.values,該屬性只返回單元格的值it
#該方法僅遍歷單元格的值 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 = ws['A4'] c.value = 'hello, world' #給單元格A4賦值
保存文件
使用save()函數是最簡單和最安全的方式
wb = Workbook() wb.save('balances.xlsx')
注意:
1) 該方式保存的文件會在沒有警告的狀況下覆蓋原來的同名文件,所以要當心
2) 文件的擴展名不必定非要xlsx,可是若是不是的話,可能會致使office打不開
保存成流
若是將文件保存成流,好比當使用Pyramid, Flask or 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,就可將workbook保存成template wb = load_workbook('document.xlsx') wb.template = True wb.save('document_template.xltx') #加載一個模板文件,經過指定屬性template爲False,就可將workbook保存成文檔 wb = load_workbook('document_template.xltx') wb.template = False wb.save('document.xlsx', as_template=False)
應該監視數據屬性和文檔擴展名,以便在模板中保存文檔,或者在文檔中保存模板,
不然結果表引擎將沒法打開文檔
如下幾種狀況會保存失敗
wb = load_workbook('document.xlsx') wb.save('new_document.xlsm') #需保存成擴展名爲xlsx,不然excel沒法打開 wb = load_workbook('document.xlsm') wb.save('new_document.xlsm') #需指定屬性keep_vba=True,不然excel沒法打開 wb = load_workbook('document.xltm', keep_vba=True) wb.save('new_document.xlsm') # 若是須要一個模板, 則須要指定擴展名爲*.xltm
加載文件
同時也可使用openpyxl.load_workbook()打開一個文件
from openpyxl import load_workbook #加載文件須要導入load_workbook類 wb2 = load_workbook('test.xlsx') print(wb2.sheetnames) #輸出:['Sheet2', 'New Title', 'Sheet1'],輸出該workbook的worksheet名字