性能openpyxl试图平衡功能和性能,但强调优化功能,因为建立API后,性能调整将变得更加容易。与其他库和应用程序相比,Openpyxl内存使用率很高,大约是原始文件大小的50倍,例如一个50MB的Excel文件使用2.5GB的内存。由于许多用例仅涉及读取或写入文件,因此“优化模式”模式意味着问题不大。基准测试所有基准测试都是合成的并且高度依赖于硬件,但它们仍然可以提供指示。写入性能可以调整基准代码以使用更多工作表,并针对字符串数据进行缩放。由于使用的Python版本也会显着影响性能,因此驱动程序脚本也可用于在具有tox环境的不同Python版本上进行测试。openpyxl性能与优秀库xlsxwriter相比:版本:python:3.6.9openpyxl:3.0.1xlsxwriter:1.2.5Dimensions:行数=1000列数=50页数=1比例文本=0.10次:xlsxwriter:0.59xlsxwriter(优化:0.54openpyxl:0.73openpyxl(优化):0.61Versions:python:3.7.5openpyxl:3.0.1xlsxwriter:1.2.5Dimensions:Rows=1000Cols=50Sheets=1Proportiontext=0.10Times:xlsxwriter:xlsxwriter:0.65openpyxl:0.70optimizedopenpyxl:0.63Versions:python:3.8.0openpyxl:3.0.1xlsxwriter:1.2.5Dimensions:Rows=1000Cols=50Sheets=1Proportiontext=0.10Times:xlsxwriter:0.54xtoplxwispy:1.10openpyxl(optimized):0.57usespreviouswriteperformanceopenpyxl用于测量性能并与旧版xlrd库进行比较的错误报告文件。xlrd主要用于.XLS旧版BIFF文件格式,它对XLSX的支持有限。对代码进行基准测试证明了在处理文件时选择正确选项的重要性。在这种情况下,禁用外部链接将阻止openpyxl打开链接工作表的缓存副本。openpyxl和xlrd的主要区别在于:openpyxl的只读模式几乎可以瞬间打开工作簿,使其适用于多进程,也大大减少了内存占用;xlrd不能自动将日期和时间转换为Python日期时间,它会相应地注释单元格,但在客户端代码中这样做会显着降低性能。版本:python:3.6.9xlread:1.2.0openpyxl:3.0.1openpyxl,只读工作簿加载1.14sOptimizationData23.17s输出模型0.00s>>DATA>>0.00s存储天数0%23.92s存储天数100%17.35s总计时间65.59s0个单元格intotalVersions:python:3.7.5xlread:1.2.0openpyxl:3.0.1openpyxl,read-onlyWorkbookloaded0.98sOptimizationData21.35sOutputModel0.00s>>DATA>>0.00sStoredays0%20.70sStore天100%16.16s总时间59.19stotalVersions中有0个单元格:python:3.8.0xlread:1.2.0openpyxl:3.0.1openpyxl,read-onlyWorkbookloaded0.90sOptimizationData19.58sOutputModel0.00s>>DATA>>0.00sStore天0%19.35s存储天数100%15.02s总时间54.85s总共0个单元格并行读取工作表是CPU密集型的,限制了通过并行化获得的任何好处。如果主要工作是转储工作簿的内容,可以使用openpyxl的只读模式,利用多CPU的优势,打开多个工作簿实例。使用与读取性能相同的源文件的示例代码表明,由于创建了额外的Python进程,性能可以以很少的开销合理扩展。优化模式只读模式当打开或写入非常大的XLSX文件时,openpyxl中的一般例程将无法处理负载,但有两种模式可以读取和写入无限量的数据在恒定的内存消耗。现在引入openpyxl.worksheet._read_only.ReadOnlyWorksheet:fromopenpyxlimportload_workbookwb=load_workbook(filename='large_file.xlsx',read_only=True)ws=wb['big_data']forrowinws.rows:forcellinrow:print(cell.value)Warning:openpyxl.worksheet._read_only.ReadOnlyWorksheetisinread-onlymode只读模式返回的单元格不是常规的openpyxl.cell.cell.Cell,而是openpyxl.cell._read_only.ReadOnlyCell。图纸尺寸只读模式依赖于创建文件的应用程序和库来提供有关图纸的正确信息,尤其是文件已使用部分的尺寸。可以使用ws.calculate_dimension()检查工作表尺寸,如果返回的尺寸不正确,可以在使用max_row和max_column属性重置工作表尺寸后使用该文件:ws.reset_dimensions()只写模式同样,常规openpyxl.worksheet.worksheet.Worksheet被更快的openpyxl.worksheet._write_only.WriteOnlyWorksheet取代。使用openpyxl.worksheet._write_only.WriteOnlyWorksheet转储大量数据需要提前安装lxml。fromopenpyxlimportWorkbookwb=Workbook(write_only=True)ws=wb.create_sheet()#用100行x100列填充数据表forirowinrange(100):ws.append(['%d'%iforiinrange(200)])#保存文件wb.save('new_big_file.xlsx')#doctest:+SKIP如果cell需要使用样式或者注释,需要openpyxl.cell.WriteOnlyCell()方法:fromopenpyxlimportWorkbookwb=Workbook(write_only=True)ws=wb.create_sheet()fromopenpyxl.cellimportWriteOnlyCellfromopenpyxl.commentsimportCommentfromopenpyxl.stylesimportFontcell=WriteOnlyCell(ws,value="helloworld")cell.font=Font(名称='Courier',size=36)cell.comment=Comment(text="评论",author="作者姓名")ws.append([cell,3.14,None])wb.save('write_only_file.xlsx')上面的代码创建了一个只有一个工作表的只写工作簿,并在工作表中添加一行,有3个单元格,一个带有自定义字体和注释的文本单元格,一个浮动单元格,一个空单元格(无论如何都会被丢弃).警告:1.与普通工作簿不同,新创建的只写工作簿不包含任何工作表,必须使用create_sheet()方法专门创建。2、在只写工作簿中,只能使用append()添加行,不能使用cell()或iter_rows()在任意位置写入(或读取)单元格。3.只写工作簿能够导出无限量的数据(甚至超过Excel实际处理的数据量),同时将内存使用量保持在10Mb以下。4.只写工作簿只能保存一次,之后每次保存工作簿或使用append()方法向已有工作表追加数据时,都会抛出openpyxl.utils.exceptions.WorkbookAlreadySaved异常。5.在将单元格实际添加到工作表之前,必须创建所添加单元格的所有内容。例如,应在添加单元格之前设置freeze_panes。
