Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
sacosta5
Contributor III
Contributor III

Cargar archivos excel con diferentes hojas

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.

1 Solution

Accepted Solutions
sorrakis01
Specialist
Specialist

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,

View solution in original post

7 Replies
sorrakis01
Specialist
Specialist

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,

sacosta5
Contributor III
Contributor III
Author

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.

sorrakis01
Specialist
Specialist

Mira lo que te acabo de editar. De alli sacaras el nombre de las pestañas. Cargalas y usalas como resident.

Saludos,

sacosta5
Contributor III
Contributor III
Author

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.

sorrakis01
Specialist
Specialist

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,

sacosta5
Contributor III
Contributor III
Author

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

https://help.qlik.com/en-US/qlikview/November2017/Subsystems/Client/Content/Scripting/ScriptRegularS...

Muchas gracias!

Saludos.

sorrakis01
Specialist
Specialist

Genial,

Un abrazo