优化模式¶
只读模式¶
有时,你可能需要打开或写入极端大的 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)
警告
openpyxl.worksheet._read_only.ReadOnlyWorksheet
是只读的
单元格的返回值不是 openpyxl.cell.cell.Cell
而是
openpyxl.cell._read_only.ReadOnlyCell
.
工作表尺寸(dimensions)¶
只读模式依赖创建文件的应用以及库提供工作表的正确信息,尤其是文件的已使用部分,称之为尺寸(dimensions)。 一些应用汇进行设置错误。可以使用 ws.calculate_dimension() 函数来检查工作表的尺寸(dimensions)。 如果返回和范围和你知道的不一样,比如说 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
错误。Everything that appears in the file before the actual cell data must be created before cells are added because it must written to the file before then. For example, freeze_panes should be set before cells are added.