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).
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').
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.
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:
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'
Donde tendríamos una nueva columna conteniendo Tables con la info de cada hoja.
Terminaríamos expandiendo los 'Datos' o alternativamente emplear la función M: Table.Combine
El código completo sería:
Listo. Podemos comprobar el resultado...
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 ;-)
Así pues nuestro comienzo es un fichero origen llamado: 'PQ_Source_file.xlsx', en este caso con cuatro hojas (ES,FR, DE e IT).
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').
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.
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
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'
Donde tendríamos una nueva columna conteniendo Tables con la info de cada hoja.
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"
Listo. Podemos comprobar el resultado...
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.