14 de abril de 2004

Exportar a MS-Excel más de 65,000 registros (via Automation)

Una de las limitaciones de MS-Excel (no así de VFP con su comando COPY TO .. TYPE XL5), es que no se pueden pasar más de 65,000 registros a la vez, el MVP VFP Cetin Basoz, nos ofrece una forma de resolver tal problema....

La técnica usada es crear un libro de MS-Excel, a partir de ahí, copiar desde el cursor a exportar, los registros necesarios para que puedan caber en una hoja, agregar a dicha hoja los registros copiados a un DBF.

Clear All
* Create a test cursor
Create Cursor testcursor (Rcno i,cType c(10), nType i, dType d)
Rand(-1)
For ix = 1 To 200000 && Create 200000 recs cursor
  Insert Into testcursor Values ;
    (Recco()+1,Sys(2015), Int(Rand()*1000), Date()-Int(Rand()*100))
Endfor

Set Safety Off

Wait Window Nowait "Por favor espere, enviando datos a Excel..."
lnTotal = Reccount()
oExcel = Createobject("Excel.application")
With oExcel
  .Visible = .T.
  oMasterWorkBook = .workbooks.Add && Add a new workbook
  lnMaxRows = .ActiveWorkBook.ActiveSheet.Rows.Count && Get max row count
  lnNeededSheets = Ceiling( lnTotal / (lnMaxRows - 1) ) && 1 row header

  lnCurrentSheetCount = .sheets.Count
  If lnNeededSheets > lnCurrentSheetCount
    .sheets.Add(,.sheets(lnCurrentSheetCount),;
      lnNeededSheets - lnCurrentSheetCount) && Add new sheets after old ones
  Endif
Endwith
With oMasterWorkBook
  For ix = 1 To lnNeededSheets
    .sheets.Item(ix).Name = "Page "+Padl(ix,3,"0")
  Endfor

  lcExportName = Sys(5)+Curdir()+Sys(2015)+".dbf"
  For ix = 1 To lnNeededSheets
    lnStart = ( ix - 1 ) * (lnMaxRows-1) + 1

    Copy To (lcExportName) ;
      for Between(Recno(),lnStart,lnStart+lnMaxRows-2) ;
      type Fox2x

    oSourceWorkBook = oExcel.workbooks.Open(lcExportName)
    .WorkSheets(ix).Activate
    oSourceWorkBook.WorkSheets(1).UsedRange.Copy(;
      .WorkSheets(ix).Range('A1'))
    oSourceWorkBook.Close(.F.) && Close w/o save
    Erase (lcExportName)

  Endfor
  .WorkSheets(1).Activate
Endwith
Wait Clear

PS:FoxyClasses dbf2Excel también usa otro método de transferencia via ADO, el cuál, puede completar el proceso aún si los datos tienen campos de tipo Memo.

Çetin Basöz
MS Foxpro MVP, MCP
http://www.foxyclasses.com

Traducido por: Esparta Palma

No hay comentarios. :

Publicar un comentario