Excelente aporte, lo probe y hasta ahora me a funcionado bien. Yo utilizaba otro y para facilitar el uso hice un procedimiento que adapte para este, acá se los dejo, pueden mejorarlo (deben darcargar C2E, es para utilizarlo de manera mas práctica:
*===========================================================================
*--------------------------------------------------------
*--- Procedimiento ToExcelNew
* Autor: Alejandro García 2023
* Usa el prg C2E (_Copy2Excel) de Walter Valle descargarlo en:
https://github.com/wvalle/C2E*
* Procedimieno para guardar una tabla de manera sencilla en un archivo de Excel en formato XLSX
* Por defecto lo guarda en la carpeta C:\Temp.
*
* Parámetros:
* tcNomArc: Nombre del archivo generado, si no se envia toma el mismo nombre de la tabla con la que se genera.
* tcRuta: Es la ruta a donde se va a guardar el archivo, si no existe por defecto lo guarda en "C:\Temp"
* tlTotales: Parámetro lógico. Si desea que el archivo en Excel totalice una o más columnas, recibe .F. (NO TOTALIZA) o .T. (TOTALIZA Y DEBE PASAR LAS COLUMNAS)
* tcListatotales: Si se desea totalizar algunas columnas, se debe pasar la lista con los nombres separados por coma de las columnas a totalizar. Algo a tener en cuenta:
* para que se pueda relizar la totalización, las columnas deben ser númericas.
* tlOW: Logico, si se desea reemplazar o no el el archivo si existe, pregunta para este efecto.
*
* Ej.: ToExcelNew([EjemploCT], [C:\Temp\], .T., [Precio,Stock], .F.)
* El ejmplo guarda el archivo con el nombre EjemploCT.xlsx en la carpeta C:\Temp\ y totaliza las columnas Preico y Stock
*
* SELECT Clientes
* ToExcelNew(, [C:\Temp\], .F., , .F.)
* Se guarda el arhcivo con el nombre de la tabla en este caso Clientes.xlsx en la carpeta C:\Temp\ y no totaliza ninguna columna
* Se recomienda no usar la extensión en el parametro del nombre del arhcivo.
*---------------------------------------------
PROCEDURE ToExcelNew
LPARAMETERS tcNomArc, tcRuta, tlTotales, tcListaTotales, tlOW
*--- Para saber si eliminamos primeramente el archivo si ya existe
IF TYPE("tlOW") # "L"
lcOW = .F.
ELSE
lcOW = tlOW
ENDIF
*--- Para determinar si el archivo de salida va a tener o no totales en las columnas númericas
IF TYPE("tlTotales") # "L"
llTotales = .F.
ELSE
llTotales = tlTotales
ENDIF
IF llTotales
IF EMPTY(ALLTRIM(tcListatotales))
MESSAGEBOX([Señor Usuario: debe dar la lista de columnas a totalizar], 0 + 16, [Error: faltan parámetros])
RETURN
ELSE
lcListaTotales = tcListaTotales
ENDIF
ENDIF
lcName = IIF(TYPE("tcNomArc") = "L", ALIAS(), ALLTRIM(tcNomArc))
lcRuta = IIF(VARTYPE(tcRuta) # "C" OR EMPTY(tcRuta), ;
"C:\Temp\", tcRuta)
lcNombre = lcRuta + ALLTRIM(lcName) + '.XLSX'
IF lcOW
DELETE FILE &lcNombre RECYCLE
ENDIF
WaitWindowCentrado("Generando achivo... espere un momento", 1,)
lnAlias = ALIAS()
SELECT &lnAlias
GO TOP
IF llTotales
IF _Copy2Excel(lnAlias, lcNombre, lcListaTotales)
_OpenExcel(lcNombre)
ENDIF
ELSE
IF _Copy2Excel(lnAlias, lcNombre)
_OpenExcel(lcNombre)
ENDIF
ENDIF
WaitWindowCentrado("Proceso terminado, se ha generado el archivo " + lcNombre, 1,)
ENDPROC
*===========================================================================
El viernes, 15 de septiembre de 2023 a las 11:38:51 UTC-5, Walter Valle escribió:
Hola amigos,
Les dejo el link de este "bicho" que hice y que en parte lo saque de un ejemplo que esta en la pagina de este foro, le metí algunos "condimentos" para mi uso y necesidad. Puedo exportar millones de registros sin problemas.
Si, puede ser mejorada y/o potenciada, la tendré en mi
Github y cualquier mejora o error corregido me avisan para mantenerla actualizada. Ahí en el link hay un código simple de ejemplo porque unas lineas de código valen mas que 100 palabras jejeje.
Saludos,
Walter Valle
San Pedro Sula, Honduras.