Artículo
· 8 feb, 2023 Lectura de 3 min

Leyendo archivos Excel usando Python Embedded

Python Embedded es una gran herramienta considerando la simpleza y gran cantidad de librerías disponibles, así como una gran comunidad de desarrolladores con toneladas de ejemplos y documentación.

En el siguiente ejemplo les presento una solución para un problema común utilizando Python y ObjectScript.

Un caso de uso muy común es recuperar data desde planillas excel y poblar un objeto persistente en nuestro modelo en IRIS.

para esto utilizaremos pandas, una popular librería Python que nos permite trabajar con DataFrames

En primer lugar instalaremos dicha librería y sus dependencias utilizando ./irispip

RutaAIrisBin> .\irispip.exe install pandas
RutaAIrisBin> .\irispip.exe install xlrd
RutaAIrisBin> .\irispip.exe install openpyxl

Una vez finalizada la operación podemos comenzar:

1.- Crearemos una clase persistente en IRIS, es este caso con 2 propiedades Marca y Precio (trabajaremos con una planilla Excel con marcas y precios de vehículos).

 

2.- Dentro de nuestra Clase definimos un método Python para leer el archivo, convertirlo en DataFrame y luego transformarlo a json. Lo cual devolveremos para posterior proceso en ObjectScript.

 

Method ReadXlsx(file As %String) [ Language = python ]
{
    import pandas as pd
    import json

    df = pd.read_excel(file)

    result = df.to_json(orient="split")
    parsed = json.loads(result)
    return(json.dumps(parsed))
}

 

3.- Ya con nuestra data en json, la recibimos en ObjectScript como DynamicObject, iteramos sobre ella . A continuación creamos una instancia de nuestra clase persistente, asignamos valores  y guardamos

Method GetData(file)
{

	set dataJson = ##class(%DynamicObject).%FromJSON(..ReadXlsx(file))
	zw dataJson.data

	set iterator = dataJson.data.%GetIterator()
	while iterator.%GetNext(.key, .value) {
		w key _ " " _ value.%Get(0) _ " "_ value.%Get(1),!
		
		set fila = ##class(Test.ReaderXls).%New()
		set fila.Marca = value.%Get(0)
		set fila.Precio = value.%Get(1)

		do fila.%Save()
		k fila
	}
}

 

4.- Finalmente ejecutamos nuestra clase y tendremos los datos en nuestro modelo.

set a = ##class(Test.ReaderXls).%New()

do a.GetData("C:\Proyectos\autos.xlsx")

Acá les dejo la clase completa y espero que esta información les sea de utilidad

Class Test.ReaderXls Extends %Persistent
{

Property Marca As %String(MAXLEN = 50);
Property Precio As %String(MAXLEN = 50);
Method ReadXlsx(file As %String) [ Language = python ]
{
	import pandas as pd
	import json

	df = pd.read_excel(file)

	result = df.to_json(orient="split")
	parsed = json.loads(result)
	return(json.dumps(parsed))
}

Method GetData(file)
{

	set dataJson = ##class(%DynamicObject).%FromJSON(..ReadXlsx(file))
	zw dataJson.data

	set iterator = dataJson.data.%GetIterator()  
	
	while iterator.%GetNext(.key, .value) {
		w key _ " " _ value.%Get(0) _ " "_ value.%Get(1),!
		
		set fila = ##class(Test.ReaderXls).%New()
		set fila.Marca = value.%Get(0)
		set fila.Precio = value.%Get(1)

		do fila.%Save()
		k fila
	}
}



}
Comentarios (0)1
Inicie sesión o regístrese para continuar