Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Carga de múltiples Excel y múltiples hojas

Buenos días,

antes que nada quería agradecer que me hayáis permitido entrar al grupo de qlik en español.

Y ahora mi “problema” que es el siguiente, tengo varios Excels lo cuales guardan la información de los usuarios locales de diversos servidores, dichos Excel tienen nombres diferentes según quien sea el cliente, pero dentro de cada Excel la estructura es idéntica.

Resulta que a la hora de realizar la carga he conseguido que lea un directorio en el que se encuentran los diferentes ficheros de los clientes siendo capaz de distinguir entre los diferentes clientes por tanto esa parte en principio no me preocupa, sino que lo que realmente me falla es la carga de las diferentes hojas de los Excel, es decir, a la hora de cargar la primera hoja todo sale perfecto, pero cuando carga las siguientes actúa de forma rara añadiendo, creo yo, todos los datos que va cargando en la misma “tabla” del primer servidor incluidos los datos de los servidores del segundo cliente y añadiendo además tablas sintéticas.

Dejo el código que utilizo para la carga así como una evidencia de la carga de dicho código y un Excel con la estructura de los ficheros,

gracias de antemano por la respuesta,

Roger A. Reina Hdez

P.d.: Soy nuevo en el mundo de Qlikview, así que perdonad si no hablo con propiedad con respecto a ello.

Código:

 
SUB LoadAllExcelSheets(vFile)

ODBC CONNECT32 TO [Excel Files;DBQ=$(vFile)];

tables:
SQLtables;
DISCONNECT;

     
LET vSheetCount = NoOfRows('tables');

     
FOR i = 0 to $(vSheetCount) -1

 
// The replace function is used because the sheet names in my example files contain a period character.
  // The odbc driver replaces these with the # character. These # characters need to be turned in periods again.
     
LET vSheetName = replace(purgeChar(purgeChar(peek('TABLE_NAME', $(i), 'tables'), chr(39)), chr(36)),'#','.');
     
LET vFichero = SubField('$(vFile)','\',6);

         
LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1) as Cliente
         
FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);

     
NEXT i

     
DROP TABLE tables;

END SUB

/*--------------------------------------------------------------------------------------------------*/
SUB ScanFolder(Root)
     
FOR EACH FileExtension in 'xlsx'
     
FOR EACH FoundFile in filelist( Root & '\*' & FileExtension)                 
     
CALL LoadAllExcelSheets('$(FoundFile)');                   
     
NEXT FoundFile
     
NEXT FileExtension
     
FOR EACH SubDirectory in dirlist( Root & '\*' )
     
CALL ScanFolder(SubDirectory)
     
NEXT SubDirectory
END SUB

CALL ScanFolder('prueba') ;

5 Replies
alexdataiq
Partner - Creator III
Partner - Creator III

Hola Roger,

Si todas tus hojas tienen las mismas columnas entonces QlikView las debe de estar concatenando de manera automática, esto es un comportamiento normal de QV. Pregunta: ¿Cuál era el comportamiento esperado del script, qué creara una tabla diferente por cada hoja del documento de Excel?

Saludos

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Roger:

Aquí tienes varios enlaces que te ayudarán a resolver tu problema

Re: Load Multiple sheets from one Excel files

Re: Load multiple sheets from one excel file.

Load multiple Excel's sheets

Saludos

Joaquín

rulohx87
Contributor III
Contributor III

Como dijo Alejandro, es posible que te este concatenando las hojas si es que posen la misma estructura.  Podrías tratar poniendo NoConcatenate antes de tu LOAD


   LET vFichero = SubField('$(vFile)','\',6);

    Qualify *;
   NoConcatenate
  
LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1)as Cliente

    FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);

    Unqualify *;


En todo caso manda un Screenshot de tu visor de Tablas. Y lo que deseas ver.

ecolomer
Master II
Master II

Prueba con este ejemplo, donde puedes leer todas las hojas excel de un directorio y todas las pestañas de cada hoja

Espero que te sirva

Anonymous
Not applicable
Author

Hola Roger,

Cuando cargas tus datos estás haciendo lo que se llama autoconcatenar. Cuando dos tablas tienen los mismos campos, qlikview las autoconcatena.

Para romper este comportamiento se pone NOCONCATENATE antes de cargar la tabla, pero el problema es que puedes crear tablas sintéticas, que afectan al rendimiento.

Otra cosa que puedes hacer es dar nombres diferentes a las tablas y usar Qualify, te pongo un ejemplo:


QUALIFY *;

UNQUALIFY (Los campos que tengan que ser clave)

$(vSheetName):

LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1) as Cliente
         
FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);

UNQUALIFY *;


Con esto consigues crear una tabla para cada hoja, pero uniendo solamente por los campos que indiques en el UNQUALIFY. Cuando termines haces un UNQUALIFY *.

Para más información de lo que hace Qualify y Unqualify: https://community.qlik.com/docs/DOC-7963

Saludos!