Velocidad al pasar datos a XLS
Velocidad al pasar datos a XLS
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
Gracias por su ayuda
Re: Velocidad al pasar datos a XLS
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
-
- Posts: 440
- Joined: Fri Oct 07, 2005 2:17 pm
- Location: Lima - Peru
- Contact:
Re: Velocidad al pasar datos a XLS
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
Lima-Peru
xHb 1.23, Fwh 20.04, MySQL 5.7 - 8.0, SQLLIB 1.9m, SQLRDD
Re: Velocidad al pasar datos a XLS
yo uso texcelScrip , y la verdad es bastante rapido, aqui un pedazo de codigo.
de esta forma se hace bastante rapido, en archivos con miles de registros.
saludos..
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
saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico
' Sin +- FWH es mejor "
SysCtrl Software
Mexico
' Sin +- FWH es mejor "
Re: Velocidad al pasar datos a XLS
Gracias amigos voy a intentar las soluciones
Re: Velocidad al pasar datos a XLS
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
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
- Ramon Paredes
- Posts: 215
- Joined: Fri Feb 02, 2007 3:38 pm
- Location: Managua, Nicaragua
Re: Velocidad al pasar datos a XLS
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
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......
Re: Velocidad al pasar datos a XLS
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
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
- Ramon Paredes
- Posts: 215
- Joined: Fri Feb 02, 2007 3:38 pm
- Location: Managua, Nicaragua
Re: Velocidad al pasar datos a XLS
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
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......
Re: Velocidad al pasar datos a XLS
Hola Ramon
Tengo la FileXls.LIB que utilizaba en FW23 puedo usar la misma ahora con FWH o requiero otra ?
Tengo la FileXls.LIB que utilizaba en FW23 puedo usar la misma ahora con FWH o requiero otra ?
- Ramon Paredes
- Posts: 215
- Joined: Fri Feb 02, 2007 3:38 pm
- Location: Managua, Nicaragua
Re: Velocidad al pasar datos a XLS
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
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......
-
- Posts: 257
- Joined: Wed May 16, 2007 9:40 pm
- Location: Iquique Chile
Re: Velocidad al pasar datos a XLS
Como se puede Insertar una imagen con esta funcion en el archivo Excel de salida
Fivewin 11.07