En este nuevo apunte rápido voy a revisar cómo copiar filas de Excel creando una nueva planilla por medio de Python.
Para realizar esto voy a compartir un pequeño programa que hice, explicando su razonamiento en cada paso.
El objetivo es: encontrar un dato en una fila, luego copiar esa fila y pegarla dentro de una planilla distinta.
Es importante recordar que no soy un experto en este lenguaje de programación, por lo que aunque el código funciona seguro puede mejorarse.
Así que sin más introducción…
El código
Este es el programa en cuestión. El nombre del documento en mi carpeta es “buscar.py”, pero eso es solamente por ponerle un nombre.
Primero voy a compartir el código completo , por si solamente te interesa empezar a trabajar. Luego voy a revisar el programa más en profundidad, explicando parte por parte.
import openpyxl
#Directorios busqueda
wb = openpyxl.load_workbook(r'/ruta_al_directorio/inventario.xlsx')
# planillas activa
ws = wb.active
#Directorio y planilla de guardado
wb2 = openpyxl.load_workbook(r'/ruta_al_directorio/guardados.xlsx')
ws2 = wb2.active
#listas a buscar
inventariolista = [300980]
def buscar_inventario():
for row in ws.iter_rows():
for cell in row:
encontrado = [cell.value for cell in row]
if cell.value in inventariolista:
print(encontrado)
ws2.append(encontrado)
print("Articulo encontrado")
buscar_inventario()
wb2.save("guardados.xlsx")
print("Archivo guardado.")
Mi documento Excel:
Para que el siguiente código funcione, voy a necesitar algunas cosas en mi equipo.
Lo primero que voy a necesitar es un archivo de Excel, para poder interactuar con su información. Realmente puedo usar más de un archivo al mismo tiempo, pero para empezar voy a limitarme a uno solo para entender como funciona el asunto.
Este archivo Excel tiene que estar en el formato “.xlsx”, o de otra forma no puedo continuar.
Por si te interesa revisarlo, también tengo un apunte sobre como convertir archivos “.xls” en la extensión “.xlsx” utilizando Pyhon.
Entonces tengo mi propio archivo, llamado “inventario.xlsx” y que consta solamente de tres productos. Su interior se ve de la siguiente forma:
Identificación | Nombre | Precio |
100125 | Cuaderno | 950.00 |
200450 | Transportador | 100.00 |
300980 | Calculadora | 700.00 |
Solamente tiene tres productos, pero no necesito más que eso para verlo funcionando. En la realidad ya probé este código con planillas que constaban de miles de lineas, y funcionó perfectamente.
Pensado de otra forma, mi tabla tiene tres columnas verticales y cuatro filas horizontales. Esa es otra forma posible de describirla.
Lo segundo que voy a necesitar es otro archivo de Excel, para poder guardar la nueva información.
En mi caso este archivo se llama “guardados.xlsx” y se encuentra en la misma carpeta que “inventario.xlsx”.
Vale agregar, el código también se esta ejecutando en el mismo directorio donde se encuentran los archivos Excel. Lo mejor es que los documentos se encuentren cerados a la hora de ejecutar el programa, pueda guardarse sin problemas.
Ahora bien, es importante considerar la pregunta ¿Por qué el documento Excel tiene que estar guardado en formato “.xlsx”?
La razón de esto es que voy a utilizar Openpyxl, una librería de Python que permite leer y escribir documentos específicamente con la extensión .xlsx para Excel.
Por mi parte yo no utilizo Excel, utilizo el programa Calc de LibreOffice. Pero eso no es ningún inconveniente, porque LibreOffice permite también abrir, convertir y guardar documentos con esta extensión específica.
Cómo instalar Openpyxl
Instalar esta librería no tiene nada de dificultad. Lo hago simplemente con el comando:
pip install openpyxl
A todo esto, el programa lo estoy escribiendo y ejecutando gracias a Códium, un editor de código muy sencillo de usar.
El programa: parte 1
Voy a dividir el programa en dos partes. Primero tengo:
import openpyxl
#Directorios busqueda
wb = openpyxl.load_workbook(r'/ruta_al_directorio/inventario.xlsx')
# planillas activa
ws = wb.active
#Directorio y planilla de guardado
wb2 = openpyxl.load_workbook(r'/ruta_al_directorio/guardados.xlsx')
ws2 = wb2.active
#listas a buscar
inventariolista = [300980]
Esta primera parte, por decirlo de algún modo, sienta las bases de qué voy a buscar y donde voy a hacerlo.
Primero hago:
import openpyxl
Y con eso llamo a la librería openpyxl para poder utilizarla.
Luego describo el lugar donde se encuentra la planilla dentro de la que voy a buscar:
wb = openpyxl.load_workbook(r'/ruta_al_directorio/inventario.xlsx') ws = wb.active
Al parecer, un documento de Excel tiene dos componentes básicos. La guía de openpyxl utiliza la sigla “wb” para indicar un “workbook”.
Un workbook o libro de trabajo señala al documento de Excel en si mismo, en este caso llamado “inventario.xlsx”.
Por otra parte “ws” indica la “worksheet” o una hoja (planilla) dentro del documento principal. Un mismo documento puede estar compuesto por múltiples hojas, en principio llamadas por ejemplo “sheet1”, “sheet2”, “hoja1” o similar.
Podría especificar una hoja especifica dentro de mi archivo, pero al decir:
ws = wb.active
Quiero señalar que la hoja en la que estoy trabajando es la primera (o más bien, la única) dentro de mi workbook. Es la planilla activa del documento.
Lo siguiente en mi código es:
wb2 = openpyxl.load_workbook(r'/ruta_al_directorio/guardados.xlsx')
ws2 = wb2.active
Y lo que estoy haciendo ahora es exactamente lo mismo que lo anterior. Agrego un nuevo documento ( guardados.xlsx) y señalo cual es la hoja de ese documento en la que voy a trabajar.
La principal diferencia es que mi intención no es la de buscar dentro de este archivo, quiero usarlo más tarde para poder guardar la nueva información encontrada.
Y lo último es crear una lista, en la cual incluyo lo que estoy buscando dentro de la planilla de Excel. Lo hago con:
inventariolista = [300980]
Si lo reviso bien, mi tabla tiene tes columnas con cuatro lineas. Mi intención es la de copiar toda la linea que contenga al producto señalado con el número: “300980”.
El código: Segunda parte
Continúo analizando el programa que compartí al principio del apunte. Lo que hice fue dividirlo arbitrariamente en dos partes para poder entenderlo mejor, y esta segunda parte contiene la función de búsqueda y la acción de guardar lo encontrado.
Lo que hago ahora es crear una función llamada “buscar inventario”:
def buscar_inventario():
for row in ws.iter_rows():
for cell in row:
encontrado = [cell.value for cell in row]
if cell.value in inventariolista:
print(encontrado)
ws2.append(encontrado)
print("Articulo encontrado")
Al establecer:
for row in ws.iter_rows():
Quiero decir “por cada linea al revisar todas las lineas en la hoja ws”.
Y luego:
for cell in row:
Lo que quiere decir: “por cada celda en cada una de esas lineas”.
Esto es, mi programa va a revisar todas las lineas de la planilla, deteniéndose en cada una de las celdas.
encontrado = [cell.value for cell in row]
Este fragmento crea una nueva lista, llamada “encontrado”, que es parte de esta función. Esta lista se va a ir llenando con los elementos revisados en las celdas que coincidan con los propuestos en inventario lista”.
Lo que sigue explica mejor esto:
if cell.value in inventariolista: print(encontrado) ws2.append(encontrado) print("Articulo encontrado")
Si el valor de una celda coincide con alguno de los elementos de “inventario lista” (en este caso, el único valor buscado es: 300980) lo que va a ocurrir es que ese item va a ser agregado a la nueva lista “encontrado”.
Al escribir:
print(encontrado)
La terminal me devuelve que elementos se agregaron a esa lista hasta el momento.
Luego sucede que:
ws2.append(encontrado)
El programa actualiza la hoja del archivo de Excel correspondiente a “ws2”. En mi caso, esta es la hoja activa de la planilla donde estoy guardando la nueva información.
Y con:
print("Articulo encontrado")
La terminal me avisa si finalmente el programa encontró alguna coincidencia.
Ya casi llego al final de este breve programa. Lo que me queda es llamar a la función “buscar inventario” para ejecutarla:
buscar_inventario()
Y luego con:
wb2.save("guardados.xlsx")
Guardo los cambios, las celdas que se agregaron, en el archivo que hice para tal efecto. Sin este último paso cualquier modificación va a perderse al finalizar el programa.
Otra cosa importante es que cada nueva linea que se incluya va a escribirse al final el documento. Esto quiere decir que puedo correr el programa varias veces, y la información que se incluyó en el mismo cada vez no tendría porque borrarse.
Y para terminar hago:
print("Archivo guardado.")
Esto como un simple recordatorio en la terminal, que me dice que el programa pudo completarse con éxito.
Lo que obtengo en la nueva planilla es:
300980 | Calculadora | 700.00 |
Y es importante recordar que el dato que estoy buscando puede estar en cualquier parte de la tabla. Una vez que se encuentra, el programa copia toda la fila.
Conclusión:
En este breve apunte compartí mi experiencia explicando cómo hice para copiar filas de Excel en una nueva planilla con Python.
Estoy seguro que muchas partes del código pueden mejorarse: siendo que no tengo mucha experiencia en el tema, tengo mucho para aprender.
Sin embargo aprendí mucho escribiendo todo esto. Con surte la información también te pueda ayudar.
La seguimos en el siguiente apunte impensado.
Leave a Reply