优化模式¶
只读模式¶
有时,你可能需要打开或写入极端大的 XLSX 文件,但通用的 openpyxl 程序无法处理这么大的负载。幸运的是,有两种模式可以使你在(几乎)恒定的内存消耗下读写无限量的数据。
介绍 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)
# Close the workbook after reading
wb.close()
警告
openpyxl.worksheet._read_only.ReadOnlyWorksheet
是只读的与普通工作簿不同,只读工作簿将使用惰性加载。工作簿必须用
close()
方法显式关闭。
单元格的返回值不是 openpyxl.cell.cell.Cell
而是 openpyxl.cell._read_only.ReadOnlyCell
。
工作表维度(dimensions)¶
只读模式依赖创建文件的应用以及库提供工作表的正确信息,尤其是文件的已使用部分,称之为维度(dimensions)。一些应用会进行设置错误。可以使用 ws.calculate_dimension()
函数来检查工作表的维度。如果返回范围和你知道的不一样,比如说 A1:A1
,你可以简单重置 max_row
和 max_column
属性,即可使用该文件:
ws.reset_dimensions()
只写模式¶
常规的 openpyxl.worksheet.worksheet.Worksheet
被替代成更快的 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')
如果你想要带有样式或者注释的单元格可以使用 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')
以上会创建只有一张工作表的只写工作簿,一行写入(append)三个单元格:一个带有自定义字体和注释的文字单元格,一个浮点数单元格和一个空单元格(一定会被丢弃)。
警告
和普通工作簿不同的是,新创建的只写工作簿没有任何工作表;工作表只能由
create_sheet()
方法进行创建。在只读工作簿中,只能由
append()
来添加行。无法使用cell()
或iter_rows()
对任意位置的单元进行读取或写入。可以导出不限量的数据(即使超过 Excel 的处理上限),同时内存使用量小于 10Mb。
只写工作簿只能保存一次。之后如果任何尝试保存和添加数据(
append()
)的操作都会引发openpyxl.utils.exceptions.WorkbookAlreadySaved
异常。在实际单元格数据之前出现在文件中的所有内容都必须在添加单元格之前创建,因为它必须在添加单元格之前写入文件。例如,
freeze_panes
应该在添加单元格之前设置。