优化模式

只读模式

有时,您需要打开或写入非常大的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 .

工作表维度

只读模式依赖于创建文件的应用程序和库,这些应用程序和库提供有关工作表的正确信息,特别是工作表中使用过的部分,即维度。某些应用程序设置不正确。可以使用 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')

这将创建一个只有一张工作表的只读工作簿,并附加一行三个单元格:一个带有自定义字体和注释的文本单元格、一个浮点数和一个空单元格(无论如何都将丢弃)。

警告

  • 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用 create_sheet() 方法。

  • 在只写工作簿中,只能使用 append() . 不能在任意位置用 cell()iter_rows() .

  • 它能够导出无限量的数据(甚至超过了Excel的实际处理能力),同时将内存使用量保持在10MB以下。

  • 只写工作簿只能保存一次。之后,每次试图将工作簿或append()保存到现有工作表时,都会引发 openpyxl.utils.exceptions.WorkbookAlreadySaved 例外。

  • 在添加单元格之前,必须创建实际单元格数据之前出现在文件中的所有内容,因为在此之前必须将其写入文件。例如, freeze_panes 应在添加单元格之前设置。