Velocidad al pasar datos a XLS

Post Reply
JoseGS
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Velocidad al pasar datos a XLS

Post by JoseGS »

Hola amigos del foro, estoy utilizando TExcelScript para enviar registros de una DBF a XLS. Todo funciona muy bien pero el problema es la velocidad. Tarda demasiados minutos (unos 10) en pasar tan solo unos 180 registros... Esto es asi aun cuando hago la visualizacion al final del proceso. Existe la posibilidad de acelerar este proceso ?

Gracias por su ayuda
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Velocidad al pasar datos a XLS

Post by horacio »

Fijate la clase TsBrowse de Manuel Mercado para pasar los datos de la tabla a un excel. Es muy veloz y además esta interesante. Yo usaba tExcelscrip pero tarda mucho en escribir datos, espero te sirva
Enrrique Vertiz
Posts: 440
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Contact:

Re: Velocidad al pasar datos a XLS

Post by Enrrique Vertiz »

Otra opcion es la FILEXLS es rapidisima para creacion de archivos Excel.
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23, Fwh 20.04, MySQL 5.7 - 8.0, SQLLIB 1.9m, SQLRDD
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: Velocidad al pasar datos a XLS

Post by sysctrl2 »

yo uso texcelScrip , y la verdad es bastante rapido, aqui un pedazo de codigo.

Code: Select all

oExcel := TExcelScript():New()
oExcel:Create( cFile )

oExcel:oSheet:Cells( 1, 01 ):Value = "codigo"
oExcel:oSheet:Cells( 1, 02 ):Value = "nombre"

nRow := 2
nStart := nRow
cMemo := ""

dbselectArea( cAlias  )
dbgotop()
while !eof()

     cMemo += field->codigo
     cMemo += chr(9)+field->nombre
     cMemo += CRLF
     nRow++
    if len(cMemo) >= 16000 .or. eof()

          oClip := TClipBoard():New()
          oClip:Clear()
          oClip:SetText( cMemo )
          cCell := "A" + Alltrim( Str( nStart ) )
          oRange := oExcel:oSheet:Range( cCell )
          oRange:Select()
          oExcel:oSheet:Paste()
          oClip:End()

          nStart := nRow

          cMemo := ""
      endif


      dbskip()
      sysrefresh()
end
de esta forma se hace bastante rapido, en archivos con miles de registros.
saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
JoseGS
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: Velocidad al pasar datos a XLS

Post by JoseGS »

Gracias amigos voy a intentar las soluciones
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Re: Velocidad al pasar datos a XLS

Post by George »

Hola
A mi tambien me sucede lo mismo al usar ToExcel del xBrowse. Es muy lento, tardando hasta varios minutos en una tabla de unos cuantos cientos de registros.

Existe alguna forma de hacer mas rapido el paso a Excel desde Xbrowse?
Alguien ha modificado el metodo ToExcel() para hacerlo que funcione mas rapido?
Estoy usando FWH 2009.06

Gracias de antemano por sus sugerencias.

George
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Re: Velocidad al pasar datos a XLS

Post by Ramon Paredes »

Amigo JoseGS :

Te sugiero la clase Filexls es rapida, imaginate un reporte de 1800 registros en 12 segundos , es veloz, ya la he probado hasta con 20,000 registros y tiene un buen desempeño si necesitas ejemplos me avisas y te los envio,

Saludes desde Managua, Nicaragua

Ramon Paredes
... Desde la Tierra de lagos y Volcanes......
Dioni
Posts: 28
Joined: Tue May 12, 2009 8:45 pm
Location: Lima - Perú

Re: Velocidad al pasar datos a XLS

Post by Dioni »

Hola Ramon

Me uno a los ejemplos que puedas compartir comparti aqui en el foro.
de echo nececitamos lo siguiente:

Ejemplos de como:

1.- Leer informacion de una hoja de excel a un archicho dbf

2.- Poner fonts, colores, centrado, etc en excel ya que no viene documentado

3.- Poder protejer/desprotejer los archivos excel y/o hojas de excel

4.- tablas dinamicas.

te agradeceremos mucho.

atte. Dioni de Lima - Peru
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Re: Velocidad al pasar datos a XLS

Post by Ramon Paredes »

Dioni,

La filexls se recomienda por su velocidad de pasar datos de dbf a Xls, cabe mencionar que tiene sus limitaciones en el uso de colores, las font las puedes definir en tipo y tamaño sin problemas y la alineacion de igual forma, aqui les dejo un ejemplo de un programa que lista un maestro de empleados, ojala les sirva :

USE C:\DATA1\RGEN1

PUBLIC oFileXLS,oDlg, oLbx, oFont, oMeter, nMeter,oExcel, oHoja, oBrw

DEFINE FONT oFont NAME "Arial" SIZE 0,-11

PUBLIC lIni := .t., nReg := RecNo(), cActividad := ""

PUBLIC nFormat1, nFormat2,nContar
PUBLIC nFont1, nFont2, nFont3, nFont4
nContar = 0

xOrden = "Orden alfabetico"
lOrden = 6
PUBLIC nRow

oExcel := TOleAuto():New( "Excel.Application" )
oHoja := oExcel:Get( "ActiveSheet" )

DEFINE XLS FORMAT nFormat1 PICTURE '#,##0' // para pesetas
DEFINE XLS FORMAT nFormat2 PICTURE '#,##0.00' // para euros

DEFINE XLS FONT nFont1 NAME "Arial" HEIGHT 14 ITALIC BOLD
DEFINE XLS FONT nFont2 NAME "Arial" UNDERLINE
DEFINE XLS FONT nFont3 NAME "Arial Unicode MS" HEIGHT 9
DEFINE XLS FONT nFont4 NAME "Arial Unicode MS" HEIGHT 8


XLS oFileXLS FILE "MAESTRO1.XLS" //AUTOEXEC

XLS COL 1 WIDTH 7 OF oFileXLS
XLS COL 2 WIDTH 25 OF oFileXLS
XLS COL 3 WIDTH 15 OF oFileXLS
XLS COL 4 WIDTH 12 OF oFileXls
XLS COL 5 WIDTH 12 OF oFileXls
XLS COL 6 WIDTH 15 OF oFileXls

nRow := 2
@ nRow,1 XLS SAY "EMPRESA X DE NICARAGUA " FONT nfont1 OF oFileXLS
nRow++
@ nRow,1 XLS SAY "REPORTE GENERAL DE EMPLEADOS ACTIVOS" FONT nfont2 OF oFileXLS
nRow++
@ nRow,1 XLS SAY "CLASIFICADO POR : "+ALLTRIM(xOrden) FONT nfont2 OF oFileXLS
nRow++
@ nRow,1 XLS SAY "Numero" FONT nfont2 OF oFileXLS
@ nRow,2 XLS SAY "Nombres " FONT nfont2 OF oFileXLS
@ nRow,3 XLS SAY "Apellido1" FONT nfont2 OF oFileXLS
@ nRow,4 XLS SAY "Apellido2" FONT nfont2 OF oFileXLS
@ nRow,5 XLS SAY "Fec_Ing" FONT nfont2 OF oFileXLS
IF LORDEN = 6
@ nRow,6 XLS SAY "Cedula " FONT nfont2 OF oFileXLS
ELSE
@ nRow,6 XLS SAY "Inss" FONT nfont2 OF oFileXLS
endif
nRow += 2
GO TOP
DO WHILE .NOT.EOF()
nRow++
@ nRow,1 xls say TRIM( A->NUMERO ) FONT nFont4 of oFilexls
@ nRow,2 XLS SAY TRIM( A->NOMBRES) FONT nFont4 of oFilexls
@ nRow,3 XLS SAY TRIM( A->APELLI1) FONT nFont4 of oFilexls
@ nRow,4 XLS SAY TRIM( A->APELLI2) FONT nFont4 of oFilexls
@ nRow,5 XLS SAY TRIM( DTOC(A->FEC_ING)) FONT nFont4 of oFilexls
IF LORDEN = 6
@ nRow,6 XLS SAY TRIM( A->RUC) FONT nFont4 of oFilexls
ELSE
@ nRow,6 XLS SAY TRIM( A->INSSBI) FONT nFont4 of oFilexls
ENDIF
// @ nRow,3 XLS SAY A->DIAS FONT nFont4 of oFilexls format nFormat1
nContar = nContar + 1
SKIP
ENDDO
nRow++
nRow++
@ nRow,1 XLS SAY "Empleados " +STR(nContar) FONT nFont3 OF oFileXLS
nRow++
nRow++

XLS PAGE BREAK AT nRow OF oFileXLS

SET XLS TO DISPLAY ;
NOGRIDLINES ;
OF oFileXLS

SET XLS TO PRINTER ;
TOP MARGIN 0.6 ;
BOTTOM MARGIN 0.8 ;
LEFT MARGIN 0 ;
OF oFileXLS

ENDXLS oFileXLS

oExcel:Visible := .T.
oExcel:WorkBooks:Open(cFilePath(GetModuleFileName(GetInstance()))+"MAESTRO1.XLS")

CLOSE RGEN1



RETURN NIL


ahora bien para leer una hoja de calculo y pasar informacion a una dbf lo hago de la siguiente forma :

//====================
FUNCTION PERCAP1()
//====================

Public oExcel, oHoja, nRows, nCols,oMeter,oDlg,nActual:= 0
Public aCampos:={}, nRow, nCol,nContar:= 0

oExcel := TOleAuto():New( "Excel.Application" )
cFile := cGetFile("*.XLS", "Seleccione Fichero")
oExcel:WorkBooks:Open( cFile )
oHoja := oExcel:Get( "ActiveSheet" )

nRows := oHoja:UsedRange:Rows:Count()
nCols := oHoja:UsedRange:Columns:Count()

USE PRUEBA2 NEW VIA "DBFCDX"
ZAP

DEFINE DIALOG oDlg RESOURCE 86

REDEFINE METER oMeter Var nContar TOTAL nRows ID 107 OF oDlg UPDATE

REDEFINE BUTTON ID 105 of oDlg ACTION( INICIA( nRows,nCols,nContar ),oDlg:End() )
REDEFINE BUTTON ID 106 of oDlg ACTION( oDlg:End())

ACTIVATE DIALOG oDlg CENTERED
USE

RETURN NIL

//========================================
STATIC FUNCTION INICIA( nRows,nCols,nContar )
//========================================

FOR nRow := 5 TO nRows
nContar = nContar + 1
oMeter:Set( nContar, sysrefresh())
APPEND BLANK
FOR nCol := 1 TO nCols
xValor := oHoja:Cells(nRow,nCol):Value
if Valtype( oHoja:Cells( nRow,nCol ):Value ) = "N"
xValor := STR(xValor)
endif
FieldPut(nCol,xValor)
NEXT
//DBCOMMIT()
Memory(-1)
NEXT

MsgInfo( "Se ha creado el fichero PRUEBA2.DBF" )

CLOSE DATABASES

oExcel:Quit()
oExcel := nil

RETURN


Saludes desde Managua, Nicaragua

Ramon Paredes
... Desde la Tierra de lagos y Volcanes......
JoseGS
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: Velocidad al pasar datos a XLS

Post by JoseGS »

Hola Ramon

Tengo la FileXls.LIB que utilizaba en FW23 puedo usar la misma ahora con FWH o requiero otra ?
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Re: Velocidad al pasar datos a XLS

Post by Ramon Paredes »

JoseGS :

Te sugiero enlazar los prgs que son TFILEXLS.PRG, XLSFUNC.PRG, XLSERROR.PRG y los compilas y enlazas como uno mas de tu proyecto y listo te sirven con cualquier version de FWH o xharbour, la lib tendrias que recrearla para cada version,

Saludes desde Managua, Nicaragua

Ramon Paredes
... Desde la Tierra de lagos y Volcanes......
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Velocidad al pasar datos a XLS

Post by elmoiquique »

Como se puede Insertar una imagen con esta funcion en el archivo Excel de salida
Fivewin 11.07
Post Reply