訪問單個單元格
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方法在以列為單位遍歷文件時,先遍歷第一列,可能遍歷到第一千萬行時,內存就已經不夠了
遍歷整個文件的所有行和列
可以遍歷整個worksheet中的數據
比如一個worksheet中數據,最大坐標跨度為,最大行數為999,最大列為AA,則遍歷的范圍將是A1:AA999
相當於在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,該屬性只返回單元格的值
#該方法僅遍歷單元格的值 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名字