Openpyxl优化单元search速度

我需要在Excel工作表中search包含某些模式的单元格。 这需要比我能处理更多的时间。 下面是我可以编写的最优化的代码。 由于数据模式通常是一排一排,所以我使用iter_rows(row_offset = x)。 不幸的是,下面的代码发现给定的模式在每个for循环(从毫秒开始,几乎一分钟)中的次数越来越多。 我究竟做错了什么?

import openpyxl import datetime from openpyxl import Workbook wb = Workbook() ws = wb.active ws.title = "test_sheet" print("Generating quite big excel file") for i in range(1,10000): for j in range(1,20): ws.cell(row = i, column = j).value = "Cell[{},{}]".format(i,j) print("Saving test excel file") wb.save('test.xlsx') def FindXlCell(search_str, last_r): t = datetime.datetime.utcnow() for row in ws.iter_rows(row_offset=last_r): for cell in row: if (search_str == cell.value): print(search_str, last_r, cell.row, datetime.datetime.utcnow() - t) last_r = cell.row return last_r print("record not found ",search_str, datetime.datetime.utcnow() - t) return 1 wb = openpyxl.load_workbook("test.xlsx", data_only=True) t = datetime.datetime.utcnow() ws = wb["test_sheet"] last_row = 1 print("Parsing excel file in a loop for 3 cells") for i in range(1,100,1): last_row = FindXlCell("Cell[0,0]", last_row) last_row = FindXlCell("Cell[1000,6]", last_row) last_row = FindXlCell("Cell[6000,6]", last_row) 

多次循环浏览工作表是无效的。 search逐渐变慢的原因似乎是在每个循环中使用越来越多的内存。 这是因为last_row = FindXlCell("Cell[0,0]", last_row)意味着下一次search将在行尾创build新的单元格:openpyxl按需创build单元格,因为行在技术上可以是空的,但是单元格是仍然可以寻址。 在脚本结尾处,工作表共有598000行,但始终从A1开始search。

如果您希望多次search一个大文件的文本,那么创build一个以坐标为值的文本为关键字的matrix可能是有意义的。

就像是:

 matrix = {} for row in ws: for cell in row: matrix[cell.value] = (cell.row, cell.col_idx) 

在现实世界的例子中,你可能想使用defaultdict来处理具有相同文本的多个单元格。

这可以与只读模式相结合,以实现最小的内存占用。 当然,如果你想编辑文件。