Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: hsk75rv en 26 Diciembre 2016, 18:39 pm



Título: [Python] Buscar y obtener el valor de una celda concreta de excel
Publicado por: hsk75rv en 26 Diciembre 2016, 18:39 pm
Hola a todos!  :D

A continuación quiero compartir con vosotros un sencillo script que he hecho para obtener el valor de una determinada celda que sabemos que está en un archivo Excel pero que no sabemos su posición.

Imaginemos que tenemos un archivo Excel con productos que tenemos en una tienda.
A la vez, imaginemos que su estructura es del tipo:
Código:
PRODUCTO	PRECIO	DISPONIBLE
HP 1500 SI
CANON 300 NO
MACBOOK 2000 SI


Si quisiéramos por ejemplo buscar el producto HP que suponemos que está en el excel y, si
sabemos además que para cada producto tenemos 3 columnas que indican, a parte del PRODUCTO en sí, el PRECIO y si está o no DISPONIBLE podemos usar el siguiente script:

Código
  1. from xlrd import open_workbook,XL_CELL_TEXT
  2. from xlrd.sheet import ctype_text
  3. import re
  4.  
  5. def xls_KeyValue(file, row_KeySeacrh, col_KeySearch):
  6. pos_RowSearch = None
  7. pos_ColSearch = None
  8. wb = open_workbook(file, 'rb')
  9. sh = wb.sheet_by_index(0)
  10. row_KeySeacrh = re.compile(row_KeySeacrh)
  11. col_KeySearch = re.compile(col_KeySearch)
  12.  
  13. for rows in range(sh.nrows):
  14. rows_int = rows # Stores the number of row where row_KeySearch will match
  15. rows = str(sh.row(rows))
  16.  
  17. if (row_KeySeacrh.search(rows)):
  18. pos_RowSearch = rows_int
  19.  
  20. for cols in range(sh.ncols):
  21. cols_int = cols # Stores the number of col
  22. cols = str(sh.col(cols))
  23. if col_KeySearch.search(cols):
  24. pos_ColSearch = cols_int
  25. return((sh.cell(pos_RowSearch, pos_ColSearch)))
  26. else:
  27. continue
  28. else:
  29. continue
  30.  
  31.  



Para hacer uso de la función lo haríamos así:

Código
  1. print(xls_KeyValue(file,'HP','DISPONIBLE'))

El primer parámetro de la función es el archivo EXCEL (xls) que queremos analizar; el segundo argumento, row_KeySeacrh le indica a la función la fila en la cual está el dato o producto del cual queremos obtener su valor correspondiente de excel y, col_KeySearch indica la columna en la cual está el valor o, el estado del producto que indicamos en row_KeySeacrh.


Así pues,
Código
  1. print(xls_KeyValue(file,'HP','DISPONIBLE'))

daría como resultado 'text:SI' (puesto que el PRODUCTO HP, el valor de la columna DISPONIBLE para ese producto es SI).

Espero que el código os sirva y sobretodo, me gustaría saber cómo hacerlo más legible o más entendible o si es óptimo u no (habría que parsear la salida porque aparecen elementos que son propios de cómo el módulo xlrd trabaja).


Gracias !  :D