tutorial - python openpyxl read xlsx
Openpyxl optimiza la velocidad de búsqueda de celdas (1)
Looping sobre una hoja de trabajo varias veces es ineficiente. El motivo de que la búsqueda se vuelva cada vez más lenta parece ser que cada vez se usa más memoria en cada ciclo. Esto es porque last_row = FindXlCell("Cell[0,0]", last_row)
significa que la siguiente búsqueda creará nuevas celdas al final de las filas: openpyxl crea celdas a pedido porque las filas pueden estar técnicamente vacías pero las celdas en ellas son aún direccionable Al final de la secuencia de comandos, la hoja de cálculo tiene un total de 598000 filas pero siempre comienza a buscar desde A1
.
Si desea buscar un archivo grande para texto varias veces, entonces probablemente tendría sentido crear una matriz marcada por el texto con las coordenadas siendo el valor.
Algo como:
matrix = {}
for row in ws:
for cell in row:
matrix[cell.value] = (cell.row, cell.col_idx)
En un ejemplo del mundo real, es probable que desee utilizar un valor defaultdict
para poder manejar varias celdas con el mismo texto.
Esto podría combinarse con el modo de solo lectura para una huella de memoria mínima. Excepto, por supuesto, si quiere editar el archivo.
Necesito buscar en la hoja de Excel las celdas que contienen algún patrón. Lleva más tiempo de lo que puedo manejar. El código más optimizado que podría escribir está a continuación. Dado que los patrones de datos suelen ser fila tras fila, utilizo iter_rows (row_offset = x). Lamentablemente, el código siguiente encuentra el patrón dado un número creciente de veces en cada bucle for (desde milisegundos y hasta casi un minuto). ¿Qué estoy haciendo mal?
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)