Utilizar el copy to ... type xls es muy limitado. Yo uso esta otra rutina que no es mía y no recuerdo de quién es. Por favor el que lo sepa que ponga los créditos pertinentes.
Lo que hace es armarte una solapa por cada grupo de 65000 registros, pero me parece (aunque no lo probé) que puedes aumentar ese número hasta el límite de filas que acepta un Excel moderno. Cuestión de probar.
********************************************************************
********************************************************************
*!* FUNCTION Exp2Excel( [cCursor, [cFileSave, [cTitulo]]] )
*!*
*!* Exporta un Cursor de Visual FoxPro a Excel, utilizando la
*!* técnica de importación de datos externos en modo texto.
*!*
*!* PARAMETROS OPCIONALES:
*!* - cCursor Alias del cursor que se va a exportar.
*!* Si no se informa, utiliza el alias
*!* en que se encuentra.
*!*
*!* - cFileName Nombre del archivo que se va a grabar.
*!* Si no se informa, muestra el libro generado
*!* una vez concluída la exportación.
*!*
*!* - cTitulo Titulo del informe. Si se informa, este
*!* ocuparía la primera file de cada hoja del libro.
********************************************************************
********************************************************************
parameters ccursor, cfilesave, ctitulo
local cwarning
if empty(ccursor)
ccursor = alias()
endif
if type('cCursor') # 'C' or !used(ccursor)
messagebox("Parámetros Inválidos",16,_vfp.msgbox_error)
return .f.
endif
*********************************
*** Creación del Objeto Excel ***
*********************************
wait window 'Abriendo aplicación Excel.' nowait noclear
oexcel = createobject("Excel.Application")
wait clear
if type('oExcel') # 'O'
messagebox("No se puede procesar el archivo porque no tiene la aplicación" ;
+ chr(13) + "Microsoft Excel instalada en su computadora.", 16, _vfp.msgbox_error)
return .f.
endif
oexcel.workbooks.add
local lnrecno, lnpos, lnpag, lncuantos, lnrowtit, lnrowpos, i, lnhojas, cdefault
cdefault = addbs(sys(5) + sys(2003))
select (ccursor)
if eof()
lnrecno = 0
else
lnrecno = recno(ccursor)
endif
go top
*************************************************
*** Verifica la cantidad de hojas necesarias ***
*** en el libro para la cantidad de datos ***
*************************************************
lnhojas = round(reccount(ccursor)/65000,0)
do while oexcel.sheets.count < lnhojas
oexcel.sheets.add
enddo
lnpos = 0
lnpag = 0
do while lnpos < reccount(ccursor)
lnpag = lnpag + 1 && Hoja que se está procesando
wait windows 'Exportando datos a Excel...' noclear nowait
if file(cdefault + ccursor + ".txt")
delete file (cdefault + ccursor + ".txt")
endif
copy next 65000 to (cdefault + ccursor + ".txt") delimited with character ";"
lnpos = recno(ccursor)
oexcel.sheets(lnpag).select
xlsheet = oexcel.activesheet
lncuantos = afields(acampos,ccursor)
********************************************************
*** Coloca título del informe (si este es informado) ***
********************************************************
if !empty(ctitulo)
xlsheet.cells(1,1).font.size = 12
xlsheet.cells(1,1).font.bold = .t.
xlsheet.cells(1,1).value = ctitulo
xlsheet.range(xlsheet.cells(1,1),xlsheet.cells(1,lncuantos)).mergecells = .t.
xlsheet.range(xlsheet.cells(1,1),xlsheet.cells(1,lncuantos)).merge
xlsheet.range(xlsheet.cells(1,1),xlsheet.cells(1,lncuantos)).horizontalalignment = 3
lnrowpos = 3
else
lnrowpos = 2
endif
lnrowtit = lnrowpos - 1
**********************************
*** Coloca títulos de Columnas ***
**********************************
for i = 1 to lncuantos
lcname = acampos(i,1)
lccampo = alltrim(ccursor) + '.' + acampos(i,1)
xlsheet.cells(lnrowtit,i).value=lcname
xlsheet.cells(lnrowtit,i).font.bold = .t.
xlsheet.cells(lnrowtit,i).interior.colorindex = 15
xlsheet.cells(lnrowtit,i).interior.pattern = 1
xlsheet.range(xlsheet.cells(lnrowtit,i),xlsheet.cells(lnrowtit,i)).borderaround(7)
next
xlsheet.range(xlsheet.cells(lnrowtit,1),xlsheet.cells(lnrowtit,lncuantos)).horizontalalignment = 3
*************************
*** Cuerpo de la hoja ***
*************************
oconnection = xlsheet.querytables.add("TEXT;" + cdefault + ccursor + ".txt", ;
xlsheet.range("A" + alltrim(str(lnrowpos))))
with oconnection
.name = ccursor
.fieldnames = .t.
.rownumbers = .f.
.filladjacentformulas = .f.
.preserveformatting = .t.
.refreshonfileopen = .f.
.refreshstyle = 1 && xlInsertDeleteCells
.savepassword = .f.
.savedata = .t.
.adjustcolumnwidth = .t.
.refreshperiod = 0
.textfilepromptonrefresh = .f.
.textfileplatform = 850
.textfilestartrow = 1
.textfileparsetype = 1 && xlDelimited
.textfiletextqualifier = 1 && xlTextQualifierDoubleQuote
.textfileconsecutivedelimiter = .f.
.textfiletabdelimiter = .f.
.textfilesemicolondelimiter = .t.
.textfilecommadelimiter = .f.
.textfilespacedelimiter = .f.
.textfiletrailingminusnumbers = .t.
.refresh
endwith
xlsheet.range(xlsheet.cells(lnrowtit,1),xlsheet.cells(xlsheet.rows.count,lncuantos)).
font.name = "Arial"
xlsheet.range(xlsheet.cells(lnrowtit,1),xlsheet.cells(xlsheet.rows.count,lncuantos)).font.size = 10
xlsheet.columns.autofit
xlsheet.cells(lnrowpos,1).select
oexcel.activewindow.freezepanes = .t.
wait clear
enddo
oexcel.sheets(1).select
oexcel.cells(lnrowpos,1).select
if !empty(cfilesave)
oexcel.displayalerts = .f.
oexcel.activeworkbook.saveas(cfilesave)
oexcel.quit
else
oexcel.visible = .t.
endif
IF lnrecno > 0
go lnrecno
endif
release oexcel,xlsheet,oconnection
if file(cdefault + ccursor + ".txt")
delete file (cdefault + ccursor + ".txt")
endif
use in (ccursor)