copiar mas de 65534 registros a hoja de calculo (XLS)

2,610 views
Skip to first unread message

José Fermín Francisco Ferreras

unread,
May 8, 2014, 7:27:34 PM5/8/14
to publice...@googlegroups.com
Buenas Noches!!

Tengo una dificultad, hice la siguiente consulta a una tabla de foxpro 9.0:

select * from tabla order by 1 asc

y luego hice el copy para exportar los resultados a hoja de calculo (XLS):

copy to c:\datos.xls xls

Debo aclarar que la consulta arroja mas de 150,000 registros, pero a la hora de exportar los datos a la hoja de calculo XLS solo exporta un total de 65,534 registros.

Como puedo hacer para que se exporten todos los registros de esta seleccion sin tener que hacerlo en partes divididas??


Fidel Charny

unread,
May 8, 2014, 7:40:23 PM5/8/14
to publice...@googlegroups.com
Puedes intentar con esta chapuza:

copy to c:\datos.xls FOX2X

Daniel Del Giudice

unread,
May 8, 2014, 7:41:44 PM5/8/14
to publice...@googlegroups.com
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
  xlsheet.name = ccursor + '_' + alltrim(str(lnpag))

  lncuantos = afields(acampos,ccursor)

  ********************************************************
  *** Coloca título del informe (si este es informado) ***
  ********************************************************
  if !empty(ctitulo)
    xlsheet.cells(1,1).font.name = "Arial"
    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)



El jueves, 8 de mayo de 2014 20:27:34 UTC-3, José Fermín Francisco Ferreras escribió:

Víctor Hugo Espínola Domínguez

unread,
May 8, 2014, 8:31:07 PM5/8/14
to publice...@googlegroups.com
Hola José

select * from tabla order by 1 asc into cursor curTmp

cursortoxml( "curTmp",  "nomPlanilla.xml", 1, 512 )

Con Excel 2007 o posterior abres el archivo nomPlanilla.xml, luego en guardar como eliges el formato de tu preferencia.

Si quieres profundizar sobre el tema mira este enlace: http://www.foxpert.com/docs/excel.en.htm

Saludos,
Víctor.
Lambaré - Paraguay.

Jose Antonio Blasco

unread,
May 9, 2014, 3:41:22 AM5/9/14
to Comunidad de Visual Foxpro en Español
Daniel, esa rutina, que yo también utilizo con algún cambio, creo que originalmente es de José G. Samper.

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

"No hay camino hacia la libertad, la libertad es el camino" - Indira Gandhi
“Nunca te olvides de sonreír, porque el día que no sonrías  será un día perdido”  -  Charles Chaplin
“Todo el mundo quiere tener un amigo, pero pocos se toman la molestia de ser uno”
- Anónimo

HernanCano

unread,
May 9, 2014, 1:15:50 PM5/9/14
to publice...@googlegroups.com
(( con tu permiso, Fermín... ))

Muchachos: Blasco, Víctor, Daniel:

¿Y qué tal COPY TO ---- CSV? 
Se puede abrir desde Excel normal.......

 

Jorge L. Florez C.

unread,
May 9, 2014, 5:20:40 PM5/9/14
to publice...@googlegroups.com
Hola Jose Fermin, la cosa es de la siguiente forma :

copy to tabla.xls type foxplus

Saludos
Jorge L. Florez C.
Lima - Perú
Reply all
Reply to author
Forward
0 new messages