访问单个单元格
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方法在以列为单位遍历文件时,先遍历第一列,可能遍历到第一千万行时,内存就已经不够了
批量访问单元格
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名字