Pythonoffice

Python-openpyxl教程4 - 优化模式

2021-04-02  本文已影响0人  庄周幻梦

前文:
Python-openpyxl教程1 - openpyxl简介
Python-openpyxl教程2 - 简单使用
Python-openpyxl教程3 - 读写性能


优化模式

只读模式

有时,您将需要打开或写入非常大的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.row:
    for cell in row:
        print(cell.value)

# Close the workbook after reading
wb.close()
\color {red} {!警告}
- 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()

# 创建一个100*200的工作表
for irow in range(100):
    ws.append(['%d' % i for i in range(200)])

# 保存为文件
wb.save('new_big_file.xlsx')

如果您想让单元格带有样式或注释,请使用openpyxl.cell.WriteOnlyCell()

from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.comments import Comment
from openpyxl.styles import Font

wb = Workbook(write_only=True)
ws = wb.create_sheet()
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')

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

\color {red} {!警告}
- 与普通工作薄不同,新创建的只写工作薄不包含任何工作表。必须使用该create_sheet()方法专门创建工作表。
- 在只写工作薄中,只能用添加行append()。无法使用cell()或在任意位置写入(或读取)单元iter_rows()
- 它能够导出无限量的数据(甚至比Excel实际处理的数据还要多),同时将内存使用量保持在10MB一下。
- 只写工作薄只能保存一次。此后每次将工作薄或append()保存到现有工作表的尝试都会引发openpyxl.utilsexceptions.WorkbookAlreadySaved异常。
- 必须在添加单元之前创建文件中实际单元数据之前出现在文件中的所有内容,因此在此之前必须将其写入文件中。例如,应在添加单元格之前设置freeze_panes

原文:https://openpyxl.readthedocs.io/en/stable/optimized.html#read-only-mode

上一篇下一篇

猜你喜欢

热点阅读