Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenas,
estoy teniendo inconvenientes para levantar archivos excel desde Qlikview. Lo que venía haciendo es levantar todos los archivos de un directorio y siempre tenían una única hoja, ahora se me presenta el problema de que tienen más de una hoja con datos.
Este es el código que venía utilizando pero solo logro levantar la primer hoja de cada uno de los archivos.
LET vBasePath = 'C:\Cargas\';
LET vBaseDir = '$(vBasePath)' & 'Tablas BD\';
LET vBaseExt = '$(vBasePath)' & 'Archivos\';
For Each file In Filelist ('$(vBaseExt)' & 'Deudas\*.*')
[Deudas]:
LOAD Fecha,
Nro,
Importe,
filename() AS Archivo_Deuda
FROM '$(file)' (biff, utf8, embedded labels,header is 3 lines);
NEXT
STORE * from [Deudas] into [Deudas].qvd;
Adjunto un archivo de ejemplo donde se puede observar que hay varias hojas (el nombre de cada una de ellas no tiene ningún criterio) y en todas el formato de las columnas es el mismo.
Cómo hago para recorrer todas las hojas independientemente del nombre que tengan?.
Desde ya gracias.
hola,
Sorry que se me paso.... Te adjunto un ejemplo que en principio te tendria que funcionar:
FOR EACH file in FileList('C:\Downloads\Ejemplo varias hojas.xlsx'); //AQUI PONES TU RUTA
ODBC CONNECT32 TO [Excel Files;DBQ=$(file)]; /*te tienes que crear una conexion ODBC de xlsx para poder recorrer los objetos de Excel*/
PreTablas: /*Nombre de la tabla donde se almacenará la info de los objetos del excel*/
SQLtables; /* instrucción necesaria para que lo haga */
DISCONNECT;
FOR i = 0 to NoOfRows('PreTablas')-1 /*Recorre el excel*/
LET sheetName = purgeChar(purgeChar(peek('TABLE_NAME', i, 'PreTablas'), chr(39)), chr(36)); /*Guardamos en una variable el nombre de la pestaña*/
TablasFinal:
LOAD *
FROM
(ooxml, embedded labels, table is '$(sheetName)'); /*Cargamos la pestaña que ha encontrado*/
NEXT i
Next
drop table PreTablas;
Saludos,
Hola,
Prueba esto:
for Each vSheet in 'Nombre1', '"Segundo nombre"', 'Otronombre'
QUALIFY *;
$(vSheet):
LOAD
*
from
[..\Downloads\Ejemplo varias hojas.xlsx]
(ooxml, no labels, table is $(vSheet));
NEXT vSheet;
OTRA OPCION SI NO SABES EL NOMBRE DE LAS PESTAÑAS ES:
FOR EACH file in FileList('..\Downloads\*.xlsx'); //AQUI PONES TU RUTA
ODBC CONNECT32 TO [Excel Files;DBQ=$(file)];
tablas:
SQLtables;
DISCONNECT;
FOR i = 0 to NoOfRows('tablas')-1
LET sheetName = purgeChar(purgeChar(peek('TABLE_NAME', i, 'tablas'), chr(39)), chr(36));
Table:
Load * ,
FileDir() as Directorio,
FileName() as Nombre_Fichero,
'$(sheetName)' as Nombre_Pestaña //ESTO TE DARA EL NOMBRE DE LA PESTAÑA
From $(file)(ooxml, embedded labels, table is [$(Nombre_Pestaña)]);
NEXT i
Next
Saludos,
Hola Jordi!..
el problema es que en un archivo figuran esos nombres de hojas ('Nombre1', '"Segundo nombre"', 'Otronombre'), en otro archivo los nombres de hojas son totalmente diferentes y a su vez pueden tener diferente cantidad de hojas. Con lo cual el nombre y la cantidad de hojas es variable en cada archivo.
Mira lo que te acabo de editar. De alli sacaras el nombre de las pestañas. Cargalas y usalas como resident.
Saludos,
No termino de entender porque se hace referencia a
tablas:
SQLtables;
Porque la tabla sería una sola que se van concatenando a medida que se leen los archivos y sus respectivas hojas.
Lo podrías poner con el ejemplo del archivo excel que pasé?.
Gracias.
hola,
Sorry que se me paso.... Te adjunto un ejemplo que en principio te tendria que funcionar:
FOR EACH file in FileList('C:\Downloads\Ejemplo varias hojas.xlsx'); //AQUI PONES TU RUTA
ODBC CONNECT32 TO [Excel Files;DBQ=$(file)]; /*te tienes que crear una conexion ODBC de xlsx para poder recorrer los objetos de Excel*/
PreTablas: /*Nombre de la tabla donde se almacenará la info de los objetos del excel*/
SQLtables; /* instrucción necesaria para que lo haga */
DISCONNECT;
FOR i = 0 to NoOfRows('PreTablas')-1 /*Recorre el excel*/
LET sheetName = purgeChar(purgeChar(peek('TABLE_NAME', i, 'PreTablas'), chr(39)), chr(36)); /*Guardamos en una variable el nombre de la pestaña*/
TablasFinal:
LOAD *
FROM
(ooxml, embedded labels, table is '$(sheetName)'); /*Cargamos la pestaña que ha encontrado*/
NEXT i
Next
drop table PreTablas;
Saludos,
Hola Jordi,
Pude solucionarlo con este último ejemplo. Nunca había utilizado ODBC para archivos por eso no había entendido la necesidad de utilizar SQLtables.
Paso este enlace por si a alguien más le puede servir
Muchas gracias!
Saludos.
Genial,
Un abrazo