Debo realizar una exportación de datos a Excel (*.xlsx)...
...pero tengo algunos problemas.
¡Buen día/tarde/noche!, requiero información y ayuda para resolver una pequeña particularidad. Tengo un programa que debe realizar una exportación de datos a Excel (*.xls) , de tres columnas obtenidas de SQL Server. Actualmente lo realiza cómodamente con ésta línea de conexión: Código:
cConn := "DBQ="+cNomArc + ";Driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;MaxScanRows=0;FirstRowHasNames=1;DriverId=278" Probé con la línea: Código:
cConn := 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ='+cNomArc+';Mode=ReadWrite;ReadOnly=False;Extended Properties="Mode=ReadWrite;ReadOnly=False;HDR=YES"' Y ahora el problema es que necesito exportarlo a *.xlsx para "modernizar" la salida de los datos; en el otro extremo (es decir, la importación de datos) tengo ésta conexión plenamente funcional y leyendo cómodamente archivos *.xlsx: Código:
cConn := 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ='+cNomArc+';Extended Properties="Mode=Read;ReadOnly=True;HDR=YES"' Obviamente, he probado con varias conexiones la exportación, hasta que me topé con una recomendación emanada directamente de Microsoft donde dice que la exportación DEBE NECESARIAMENTE ser en formato Excel 97-2003 *.xls para ser viable..., pero debo exportarlo en *.xlsx funcional si deseo continuar con el diseño del sistema... ¿Alguien tendrá alguna idea que pueda servirme? Agradezco de antemano su paciencia y comprensión. |
Podrías intentar acceder a Excel vía OLE, tú sabes, usando OleVariants y COM y llenando las celdas una a una. El problema ahí sería la velocidad. Si es una tabla muy grande podría ser algo lento. Incluso, se me ocurre que podrías poner los datos en CSV en el portapapeles y luego, mediante OLE, pegar el contenido en el archivo xlsx.
LineComment Saludos |
Cita:
Gracias. |
Un bucle recorriendo un dataset y enviando a un fichero de texto del tipo csv es rapidísimo y muy simple de hacer. ¿No te viene bien ese formato?
|
Cita:
|
Acabo de pegar 2600 registros en formato CSV en una hoja xlsx en un abrir y cerrar de ojos. A ese tiempo (abrir y cerrar de ojos) únicamente tendrías que añadir el tiempo de formar los datos CSV (debe ser imperceptible) crear el archivo y guardarlo. Te aseguro que tardará menos de un minuto y el archivo final estará en formato xlsx. Lo del CSV en memoria el cliente ni lo sabrá.
LineComment Saludos |
No tengo Delphi a mano y mi fluidez en el lenguaje ya no es lo que era, pero aquí una base de la cual partir:
LineComment Saludos |
Cita:
|
Cita:
Si esa cosa, XBase++, admite DLLs de Windows (y la solución es para ejecutarse en Windows :p), entonces podrías programar la solución en Delphi compilándola como DLL, y que la aplicación hecha en esa cosa, XBase++, llame a las funciones de la DLL para realizar la exportación. La clase TghOpenXMLSpreadsheet y asociadas están pensadas para realizar diversas tareas con documentos de OpenXML, concretamente Excel de formato moderno. Sin embargo, no están aún lo suficientemente actualizadas para trabajar fuera de Delphi XE7 o permitir la escritura de forma fácil. Actualmente estoy trabajando en la adaptación para Delphi Berlin, en la cual pienso incluir también la capacidad de comprimir y descomprimir el documento. Recordar que .xlsx no es más que un .zip con ciertas carpetas y archivos XML definidos por Microsoft. ¡Saludos! Al González. |
Cita:
|
En una situación así, revisar el estándar de esos archivos puede ser un buen punto de partida: http://www.ecma-international.org/pu...s/Ecma-376.htm
:) ¡A dónde te fuiste a meter, compadre! ¿Qué empresa es? ¿Industrias Picapiedra Jurasic Inc.? :confused: |
Cita:
|
Y al final quedó así:
OK, no es Delphi, pero creo que quedó entendible. Hace lo que debe, sin problemas o errores..., gracias a todos por su colaboración. |
Enhorabuena. Qué curiosa sintaxis.
|
Cita:
Por eso me contrataron (supuestamente), por que manejo todo éso... |
Cita:
Saludos |
Cita:
|
Cita:
LineComment Saludos |
Cita:
Los tiempos..., ni mejor ni peor, con ése código tarda cerca de 1 minuto en leer, 50 y algo mil registros.!!!:-|!!!:-|^\||/^\||/^\||/ |
La franja horaria es GMT +2. Ahora son las 14:34:31. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi