只读模式¶
有时,您需要打开或编写非常大的XLSX文件,而openpyxl中的常用方式将无法处理。幸运的是,有两种模式使您能够以固定或接近固定的内存消耗读取和写入无限的数据量。
简介:class:openpyxl.worksheet._read_only.ReadOnlyWorksheet:
from openpyxl import load_workbook
wb = load_workbook(filename='large_file.xlsx', read_only=True)
ws = wb['big_data']
for row in ws.rows:
for cell in row:
print(cell.value)
警告
- :class:
openpyxl.worksheet._read_only.ReadOnlyWorksheet
是只读的
返回的单元格类型不是:class:openpyxl.cell.cell.Cell,而是:class:openpyxl.cell._read_only.ReadOnlyCell。
工作表尺寸¶
只读模式依赖于创建文件的应用程序和库所提供有关工作表的正确信息,特别是其中已使用部分信息,即尺寸。有些应用程序设置尺寸信息不正确。您可以使用ws.calculate_dimension()
来检查该信息。如果返回一个错误范围,简单地重置max_row和max_column属性就可以使用该文件:
ws.reset_dimensions()
只写模式¶
在write- only
模式下,openpyxl.worksheet.worksheet.Worksheet
已被一个更快的替代项替换,:class:openpyxl.worksheet._write_only.WriteOnlyWorksheet
。如果要转储大量数据,请确保已安装lxml
库。
>>> from openpyxl import Workbook
>>> wb = Workbook(write_only=True)
>>> ws = wb.create_sheet()
>>>
>>> # now we'll fill it with 100 rows x 200 columns
>>>
>>> for irow in range(100):
... ws.append(['%d' % i for i in range(200)])
>>> # save the file
>>> wb.save('new_big_file.xlsx')
如果单元格包含样式或注释信息,请使用:func:openpyxl.cell.WriteOnlyCell
>>> from openpyxl import Workbook
>>> wb = Workbook(write_only = True)
>>> ws = wb.create_sheet()
>>> from openpyxl.cell import WriteOnlyCell
>>> from openpyxl.comments import Comment
>>> from openpyxl.styles import Font
>>> cell = WriteOnlyCell(ws, value="hello world")
>>> cell.font = Font(name='Courier', size=36)
>>> cell.comment = Comment(text="A comment", author="Author's Name")
>>> ws.append([cell, 3.14, None])
>>> wb.save('write_only_file.xlsx')
这将创建一个只有一张工作表的只写工作簿,并附加一个包含3个单元格的行:一个具有自定义字体和注释的文本单元格、一个浮点数单元格和一个空单元格(将被丢弃)。
请注意
- 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用:func:
create_sheet()
方法来创建工作表。 - 在只写工作簿中,只能使用以下:func:
append()
方法来添加行。不能在任意位置使用:func:cell()
或者:func:iter_rows()
方法写入(或读取)单元格。 - 它可以导出无限量的数据(甚至超过Excel的实际处理能力),同时将内存使用量控制在10Mb以下。
- 只写工作簿只能保存一次。之后,每次尝试保存工作簿或使用
append()
附加到现有工作表时都会引发一个:class:openpyxl.utils.exceptions.WorkbookAlreadySaved
异常。 - 在单元格数据之前出现在文件中的所有内容都必须在添加单元格之前创建,因为它必须在单元格之前写入文件。例如,应在添加单元格之前设置
freeze_panes
冻结窗口。