martes, 2 de marzo de 2021

Power Query: Importar todas las hojas de un libro

Un caso que se planteaba semanas atrás trataba sobre la forma en que se podía importar todas las hojas de un mismo libro que contenía, cada una de ellas, la particularidad de tener encabezados distintos (aunque con iguales conceptos).

Así pues nuestro comienzo es un fichero origen llamado: 'PQ_Source_file.xlsx', en este caso con cuatro hojas (ES,FR, DE e IT).
Power Query: Importar todas las hojas de un libro

Todas ellas con el encabezado en la fila 6 y columnas con datos variables (de la A a la G), pero solo nos interesan las columnas A:D, cuyos conceptos son:
Columna A: Fecha
Columna B: Descripción
Columna C: Cuenta
Columna D: Importe
Con estos detalles de partida claros, comenzaremos nuestro proceso de creación de una consulta en Power Query.
En un libro accederemos a la ficha Datos > grupo Obtener y Transformar > desplegable Obtener datos > Desde un archivo > Desde un archivo; y en la ventana diálogo indicaremos la ruta de nuestro fichero fuente ('PQ_Source_file.xlsx').
Power Query: Importar todas las hojas de un libro
Normalmente en esta ventana presionamos una sola de las hojas... pero en esta ocasión seleccionaremos la 'carpetita' con el nombre del fichero, y presionaremos Transformar datos.
Lo que abrirá el editor de consultas de Power Query.
Power Query: Importar todas las hojas de un libro

De momento lo dejamos como está, y abriremos una Consulta en blanco (desde el menú del editor de consultas, vamos a la ficha Inicio > grupo Nueva consulta > desplegable Nuevo origen > Otros orígenes > Consulta en blanco).
Activaremos el editor avanzado y escribiremos:
(hoja as text) as table =>
let
    Origen = Excel.Workbook(File.Contents("F:\excelforo\PQ_Source_file.xlsx"), null, true),
    //Recuperamos la primera hoja del libro!!
    Hoja1 =  Origen{[Item=hoja,Kind="Sheet"]}[Data],

    //Eliminamos las seis filas.. incluyendo los 'posibles' encabezados!!!
    #"Filas superiores quitadas" = Table.Skip(Hoja1,6),
    
    //Nos quedamos con las cuatro primeras columnas.. eliminando cualquier otra
    #"Otras columnas quitadas" = Table.SelectColumns(#"Filas superiores quitadas",{"Column1", "Column2", "Column3", "Column4"}),

    //Renombramos columnas 
    //Recuperamos una Lista los Nombres de las columnas actuales
    NombresColsOriginales = Table.ColumnNames(#"Otras columnas quitadas"),
    //Definimos una Lista con los Futuros Nombres de las cuatro columnas
    NombresColsNuevos={"Date","Description","Account","Amount"},
    
    //Componemos una Lista 'doble' con las dos anteriores usando List.Zip
    RenombramosListado = List.Zip({NombresColsOriginales,NombresColsNuevos}),
    //Finalmente con Table.RenameColumns asignamos los nombres nuevos...
    RenombradoColumnas = Table.RenameColumns(#"Otras columnas quitadas", RenombramosListado)

in
    RenombradoColumnas

Power Query: Importar todas las hojas de un libro
Es el código de una función personalizada en lenguaje M que procesa una hoja (cuyo nombre se ha parametrizado) de nuestro libro fuente ('PQ_Source_file.xlsx');
donde además eliminamos las primeras filas de cada hoja;
eliminamos columnas 'sobrantes';
y renombramos nuestras cuatro columnas con estos cuatro nombres ("Date","Description","Account","Amount").
Esta técnica ya se explicó en un artículo anterior del blog (leer aquí).

A esta función la he llamado: 'q1stTransform'.

Ahora volveremos a nuestra primera consulta, donde veíamos todas las hojas existentes de nuestro libro fuente...
Podemos usar el asistente para quedarnos solo con la columna 'Name' que contiene el nombre de las hojas... (es lo que necesitamos para alimentar nuestra función personalizada!).
Y a continuación agregar una columna personalizada, donde alimentemos la función 'q1stTransform'
Power Query: Importar todas las hojas de un libro

Donde tendríamos una nueva columna conteniendo Tables con la info de cada hoja.
Power Query: Importar todas las hojas de un libro
Terminaríamos expandiendo los 'Datos' o alternativamente emplear la función M: Table.Combine
El código completo sería:
let
    Origen = Excel.Workbook(File.Contents("F:\excelforo\PQ_Source_file.xlsx"), null, true),
    //Nos quedamos solo con la columna Name
    #"Otras columnas quitadas" = Table.SelectColumns(Origen,{"Name"}),
    //agregamos en una columna nueva la función creada: q1stTransform
    #"Personalizada agregada" = Table.AddColumn(#"Otras columnas quitadas", "Datos", each q1stTransform([Name])),
    //y expandimos Datos
    #"Se expandió Datos" = Table.Combine(#"Personalizada agregada"[Datos])
in
    #"Se expandió Datos"

Power Query: Importar todas las hojas de un libro


Listo. Podemos comprobar el resultado...
Power Query: Importar todas las hojas de un libro

Una única tabla con la información de las cuatro columnas de todas las hojas de nuestro fichero fuente... a pesar de tener encabezados diferentes!!!.
Todo un éxito ;-)

No hay comentarios:

Publicar un comentario

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