jueves, 8 de octubre de 2020

Power Query: Cargar datos de la primera hoja

Hoy veremos un excelente truco cuando debemos importar información de distintos orígenes (pongamos varios ficheros de Excel .xlsx) pero los nombres de las hojas son diferentes!!.
Pongamos tenemos tres ficheros .xlsx en una carpeta, con información a cargar en nuestra consulta... pero cada fichero contiene la información en la primera hoja con diferente nombre:
Libro1.xlsx -- hoja AAA
Libro2.xlsx -- hoja BBB
Libro3.xlsx -- hoja CCC
Power Query: Cargar datos de la primera hoja

Fundamental que la ubicación o posición de la hoja que contiene información sea siempre la misma!
Así pues comenzamos desde la ficha Datos > grupo Obtener y transformar > desplegamos Obtener Datos > Desde un archivo > Desde una carpeta.
Por supuesto, el ejemplo que expondremos a continuación es válido para cualquier otra situación de carga.
En el asistente de carga indicamos la ruta de la carpeta en cuestión donde se ubican nuestros ficheros, en mi ejemplo: F:\excelforo\CARPETA_CSV
Power Query: Cargar datos de la primera hoja

A continuación, tras Aceptar, se abrirá una vista previa del asistente.

Finalmente se abrirá el Editor de Power Query, desde donde presionaremos en la columna 'Content' el desplegable de 'Combinar archivos'
Power Query: Cargar datos de la primera hoja

Aceptaremos la opción por defecto...
Como se observa nada novedoso hasta ahora... los pasos habituales dados en tantas ocasiones...
Pero en este caso comprobamos un resultado 'esperado a medias', y es que no ha habido un anexado de información de los tres ficheros... apareciendo 'Error' para los datos de los ficheros segundo y tercero!
Power Query: Cargar datos de la primera hoja

El motivo es claro, la orden dada ha sido importar los datos de la hoja llamada 'AAA' de cualquier fichero contenido en la carpeta indicada ('F:\excelforo\CARPETA_CSV')...
Obviamente, en el segundo y tercer fichero tal hoja NO existe! :O

Podemos comprobar que ha pasado si accedemos al Editor avanzado de la consulta 'autogenerada': Transformar archivo de ejemplo
Power Query: Cargar datos de la primera hoja

Si vemos el código M generado:
let
    Origen = Excel.Workbook(Parámetro1, null, true),
    AAA_Sheet = Origen{[Item="AAA",Kind="Sheet"]}[Data],
    #"Encabezados promovidos" = Table.PromoteHeaders(AAA_Sheet, [PromoteAllScalars=true])
in
    #"Encabezados promovidos"

Comprobamos en la segunda fila lo comentado, se menciona especificamente la hoja llamada 'AAA':
AAA_Sheet = Origen{[Item="AAA",Kind="Sheet"]}[Data],

Por fin el gran truco... pero antes debes saber que Power Query utiliza la indexación de los elementos en base 0; esto significa, para nuestro caso, que la primera hoja es la cero, la segunda es la 1, la tercera la 2, etcétera...

Si reemplazamos el nombre estático de la hoja 'AAA' por 'Origen{0}[Item]'

Quedando el código de esta consulta:
let
    Origen = Excel.Workbook(Parámetro1, null, true),
    AAA_Sheet = Origen{[Item=Origen{0}[Item],Kind="Sheet"]}[Data],
    #"Encabezados promovidos" = Table.PromoteHeaders(AAA_Sheet, [PromoteAllScalars=true])
in
    #"Encabezados promovidos"

Tras 'Actualizar Todo' ya vemos el resultado en nuestra query final...
Power Query: Cargar datos de la primera hoja

Finalmente cargaríamos y cerraríamos para devolver los datos de todas las primeras hojas de cada fichero existente en la carpeta indicada, sea cual sea el nombre de esa primera hoja.

OJO!!, las hojas ocultas cuentan a efectos de enumerar las posiciones!!!.
Esto implica que si hubiera una hoja oculta posicionada como 'primera hoja', cargaría lo que contuviera!! (pudiendo 'destrozar' los resultados de nuestra consulta) :(

Alternativamente a la forma descrita anteriormente...
AAA_Sheet = Origen{[Item=Origen{0}[Item],Kind="Sheet"]}[Data],
podrías igualmente emplear esta otra forma abreviada:
AAA_Sheet = Origen{0}[Data],
que es más genérica ya que recupera indistintamente lo que hubiera (Hoja - Kind="Sheet" o Tabla - Kind="Table") en la primera hoja...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.