Excelize: con suerte un colmo para VBA

1. Introducción

Recientemente noté una biblioteca Go llamada Excelize. Proporciona muchas manipulaciones de Excel y es similar al VBA de Microsoft. Tengo interés en él, pero durante la investigación en línea encontré que muy pocas personas habían hablado de eso todavía. Excelize ya tiene 5.9k estrellas en Github (abril de 2020), actualizado con frecuencia, y tengo razones para creer que es una biblioteca muy prometedora para aprender.

Aunque no está diseñado para la disputa de datos, es puro Go y quizás un buen comienzo para reemplazar VBA. En este artículo presentaré Excel en un flujo de trabajo diario normal: leer datos, hacer algunos cambios y hacer un resumen de datos (tabla dinámica).

 

2. Instalar

Al sobresalir la página de Github (abrir  aquí ), es muy simple usar el comando go "go get github.com/360EntSecGroup-Skylar/excelize".

Pero si hay algunas "razones" por las que el comando no puede funcionar, podemos instalar manualmente Excel de la siguiente manera:

  • Clonar o descargar Excel.
  • Clone o descargue "golang.org \ x \ net" y "golang.org \ x \ text", son bibliotecas de dependencias de Excel.

 

3. Leer datos

Nos centraremos en los archivos xlsx. Por ahora excelize no tiene función para leer archivos csv. Ese podría ser el propósito del diseñador, porque leer en un archivo csv no es tan difícil en Go. Además, como mínimo, podemos cambiar manualmente un archivo csv a un archivo xlsx.

Como ejemplo, utilizaremos el archivo stocks.xlsx de la siguiente manera:

paquete main 

import ( 
	"fmt" 

	"github.com/360EntSecGroup-Skylar/excelize" 
) 

func main () { 
	file, err: = excelize.OpenFile ("stocks.xlsx") 
	if err! = nil { 
		panic (err) 
	} 
	// Imprimir celda de datos por 
	filas de celdas , err: = file.GetRows ("stocks") 
	if err! = Nil { 
		panic (err) 
	} 
	for _, row: = range rows { 
		for _, colCell: = range row { 
			fmt .Print (colCell, "\ t") 
		} 
		fmt.Println () 
	} 
}

En la consola podemos ver la salida como se muestra a continuación, que es lo suficientemente decente por ahora. 

  

 

3. Haz algunos cambios

Queremos agregar una columna a los datos, que clasifican esas compañías. Por ejemplo, queremos etiquetar AAPL y MSFT como Target, CSCO como Untarget. 

En los pandas de Python es tan fácil como filtrar los datos y etiquetarlos. 

¿Ahora qué podemos hacer en Excel?

Excelize tiene una función llamada Autofiltro (). Creo que lleva el nombre de la función AutoFilter de VBA. 



Importación principal del paquete ( 
	"github.com/360EntSecGroup-Skylar/excelize" 
) 

func main () { 
	file, err: = excelize.OpenFile ("stocks.xlsx") 
	if err! = nil { 
		panic (err) 
	} 
	// AutoFilter no funciona 
	err = file.AutoFilter ("stocks", "A1", "F11", 
		`{" column ":" D "," expression ":" Symbol == AAPL or Symbol == MSFT "}`) 
	si err ! = nil { 
		panic (err) 
	} 
	file.SaveAs ("stocks_filter.xlsx") 
}

 

Buena parte de esta función es que no necesita el rango preciso de datos. En nuestro ejemplo, el rango de datos es "A1: D10", pero uso "A1: F11" y puede funcionar bien.

Sin embargo, esta función no parece filtrar los datos como necesitamos. En el documento de Excelize, se describe como:

/ * No es suficiente solo especificar la condición del filtro. También debe ocultar las filas que no coinciden con la condición del filtro. Las filas se ocultan utilizando el método SetRowVisible (). * /

Pero normalmente no podemos saber qué fila debería estar oculta, lo que hace que esta función sea algo extraña para mí.

Además, esta función de Autofiltro tiene algo malo como en el Autofiltro de VBA: solo tienen dos condiciones de filtro. Y Excelize no tiene la función AdvancedFilter de VBA para filtrar más de dos condiciones.

Podemos usar algunos for-loop para lograr nuestro propósito de filtro. Tal vez sea de bajo nivel codificado, pero en realidad funciona bien por ahora.

paquete main 

import ( 
	"strconv" 
	"github.com/360EntSecGroup-Skylar/excelize" 
) 

func main () { 
	file, err: = excelize.OpenFile ("stocks.xlsx") 
	if err! = nil { 
		panic (err) 
	} 
	file.SetSheetRow ("stocks", "E1", y [] string {"Cat"}) 
	filas, err: = file.GetRows ("stocks") 
	if err! = nil { 
		panic (err) 
	} 
	para i: = 0; i <len (filas); i ++ { 
		para j: = 0; j <len (filas [i]); j ++ { 
			if filas [i] [j] == "AAPL" || filas [i] [j] == "MSFT" { 
				file.SetCellValue ("stocks", "E" + strconv.Itoa (i + 1), "Target"
				file.SetCellValue ("stocks", "E" + strconv.Itoa (i + 1), "Untarget")
		} 
	} 
	file.SaveAs ("stocks_filter2.xlsx") 
}

  

 

 4. Resumen de datos (tabla dinámica)

 En la función AddPivotTable, DataRange tiene que ser un rango preciso, pero PivotTableRange puede ser casual pero más grande que una celda.

paquete main 

import ( 
	"github.com/360EntSecGroup-Skylar/excelize" 
) 

func main () { 
	file, err: = excelize.OpenFile ("stocks.xlsx") 
	if err! = nil { 
		panic (err) 
	} 
	err = file .AddPivotTable (& excelize.PivotTableOption { 
		DataRange: "stocks! $ A1: $ D10", 
		PivotTableRange: "stocks! $ G1: G2", 
		Filas: [] excelize.PivotTableField {{Datos: "Símbolo"}, {Datos: " Fecha "}}, 
		Datos: [] excelize.PivotTableField {{Datos:" Cerrar ", Subtotal:" Promedio "}, 
	}}) 
	if err! = Nil { 
		panic (err) 
	} 
	file.SaveAs (" stocks_pivot.xlsx " ) 
}

  

 

Summay

Comparar Excelize con VBA no es tan justo en realidad. Microsoft ha desarrollado VBA hace casi 30 años, pero esta biblioteca abierta es de alguna manera joven.

Para una prueba fácil en este artículo, expone algunas debilidades, por ejemplo, la función de Autofiltro no tiene ninguna razón para ser tan mala como la de VBA.

Hablando de manera excelente, Excel no está listo, pero creo que el tiempo demostrará su valor en un futuro cercano. Si le interesa, la página de github dice que está abierta a la contribución.

Se puede encontrar más información en su documento ( AQUÍ ) y github ( AQUÍ ).

 

  

 

Supongo que te gusta

Origin www.cnblogs.com/drvongoosewing/p/12644222.html
Recomendado
Clasificación