Página 1 de 1

Exportar a Excel len......to

Publicado: Mar Jul 11, 2006 11:08 am
por jlalin
Ramón,
si no recuerdo mal habí­a que ocultar Excel hasta que el proceso
estuviera terminado.
oExcel := TOleAuto(:::::
oExcel:lVisible := .F.
....
oExcel:lVisible := .T.
Saludos,
José Lalí­n

Exportar a Excel len......to

Publicado: Mar Jul 11, 2006 11:56 am
por jfgimenez
Ramón,
> Estoy haciendo la exportacion a Excel, pero para barrer una base de datos
> de 9676 registro, tarda casi una hora, alguien ha hecho algo parecido y
> que le tarde menos? mucho menos?
>
> Estoy usando:
> oExcel := TOleAuto(:::::
> ::::
>
> y en un ciclo while !eof() :
> como tengo que correr los campos aplico un for:
> With Object oExcel:oAS:Cells( nRow, oCol[1] )
> :Value := Eval(oCol[2])
> :HorizontalAlignment := oCol[4]
> :Font:Size := oCol[3]
> :NumberFormat := oCol[5]
> If ( oCol[6] )
>
> End
> End With
>
> Me intriga tanta lentitud.
>
> Algunas sugerencias?
Además de lo que te ha dicho José Lalín, hay unas reglas de oro que tienes
que seguir si quieres que vaya rápido:
1) No rellenes los valores de las celdas una a una. Es mejor que copies los
valores al portapapeles de un golpe y los pegues en la hoja de cálculo.
Debes saber que para separar una celda de otra en la misma línea tienes que
meter un TAB (chr(9)) y para separar las líneas un CRLF (chr(13)+chr(10)).
P.ej., la cadena:
"A1tB1tC1rnA2tB2tC2"
dará lugar a una hoja así:
A1 B1 C1
A2 B2 C2
2) Nunca apliques estilos celda a celda. Hazlo por rangos, por filas o por
columnas. P.ej., si tienes una columna que muestra números y quieres que
estén alineados a derecha y con una máscara concreta, usa el rango
oExcel:oActiveSheet:Column( 3 )
3) Usa el comando WITH OBJECT todo lo que puedas. Así se evita invocar
continuamente a las librerías de OLE. P.ej.:
oExcel:ActiveSheet:Column( 3 ):Font:Name := "Arial"
oExcel:ActiveSheet:Column( 3 ):Font:Size := 10
llama a las librerías OLE unas 24 veces! En cambio:
WITH OBJECT oExcel:ActiveSheet:Column( 3 ):Font
:Name := "Arial"
:Size := 10
END
llamaría unas 15 veces
La comunicación por OLE no es precísamente un proceso muy rápido, pero estoy
seguro que si aplicas correctamente estas técnicas (además de ocultar excel
y no mostrarlo hasta que termine el proceso), conseguirás que tarde sólo
unos segundos.
--
Un saludo,
José F. Giménez
http://www.xailer.com

Exportar a Excel len......to

Publicado: Mar Jul 11, 2006 11:57 pm
por Rene Flores
O en su defecto, utiliza la clase FileXls para Xailer que adapté del
trabajo original de Ramon Avendaño.
Esta es la forma de hacerlo en Xailer:
> METHOD ExportaExcel CLASS LaQueSea
> LOCAL oFont1,oFont2,oFont3, oFormat1,nCiclo
> LOCAL nField, nCargo, nAbonos, x
>
> oFont1 := XLSFONT("ARIAL",10)
> oFont2 := XLSFONT("Courier new",10)
> oFont3 := XLSFONT("Courier new",10,.T.)
> oFormat1 := XLSFORMAT("#,##0.00")
>
> WITH OBJECT oXLS := TFileXls():New(cNomArchivo,,,.f.,.t.)
> :Say(1,1,NOMBRE_EMPRESA,,,oFont1)
> :Say(3,1,"Saldos del ejercicio: "+ALLTRIM(STR(EJERCICIO)),,,oFont1)
> (ALI_CATTOD)->(DBGOTOP())
> nCiclo := 5
> :_Col(1,1,20)
> :_Col(2,5,15)
> DO WHILE ! (ALI_CATTOD)->(EOF())
> :Say(nCiclo,1,(ALI_CATTOD)->cuenta+"-"+;
> (ALI_CATTOD)->subcuenta+"-"+;
> (ALI_CATTOD)->ssubcuenta+"-"+;
> (ALI_CATTOD)->auxiliar+" "+;
> (ALI_CATTOD)->Descripcio,,,oFont3)
> nCiclo++
> nField := 9
> nCargos := 0
> nAbonos := 0
> FOR x := 1 TO LEN(ARR_MESES)
> :Say(nCiclo,1,ARR_MESES[x],,,oFont2)
> :Say(nCiclo,2,(ALI_CATTOD)->(FIELDGET(nField));
> ,,,oFont2,oFormat1)
> nField ++
> :Say(nCiclo,3,(ALI_CATTOD)->(FIELDGET(nField));
> ,,,oFont2,oFormat1)
> nCargos += (ALI_CATTOD)->(FIELDGET(nField))
> nField++
> :Say(nCiclo,4,(ALI_CATTOD)->(FIELDGET(nField));
> ,,,oFont2,oFormat1)
> nAbonos += (ALI_CATTOD)->(FIELDGET(nField))
> nField++
> :Say(nCiclo,5,(ALI_CATTOD)->(FIELDGET(nField)),,,;
> oFont2,oFormat1)
> nCiclo++
> NEXT x
> :Say(nCiclo,3,nCargos,,,oFont3,oFormat1)
> :Say(nCiclo,4,nAbonos,,,oFont3,oFormat1)
> nCiclo += 2
> (ALI_CATTOD)->(DBSKIP())
> ENDDO
> :End()
> END WITH
> RETURN Nil
Saludos
Rene Flores
http://www.ciber-tec.com
Ramón Zea escribió:
> Estoy haciendo la exportacion a Excel, pero para barrer una base de datos de
> 9676 registro, tarda casi una hora, alguien ha hecho algo parecido y que le
> tarde menos? mucho menos?
>
> Estoy usando:
> oExcel := TOleAuto(:::::
> ::::
>
> y en un ciclo while !eof() :
> como tengo que correr los campos aplico un for:
> With Object oExcel:oAS:Cells( nRow, oCol[1] )
> :Value := Eval(oCol[2])
> :HorizontalAlignment := oCol[4]
> :Font:Size := oCol[3]
> :NumberFormat := oCol[5]
> If ( oCol[6] )
>
> End
> End With
>
> Me intriga tanta lentitud.
>
> Algunas sugerencias?
>
> Gracias.
--

Exportar a Excel len......to

Publicado: Mié Jul 12, 2006 3:56 am
por zeasoftware
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje news:44b375ee$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Además de lo que te ha dicho José Lalí­n, hay unas reglas de oro que tienes
> que seguir si quieres que vaya rápido:
>
> 1) No rellenes los valores de las celdas una a una. Es mejor que copies los
> valores al portapapeles de un golpe y los pegues en la hoja de cálculo.
> Debes saber que para separar una celda de otra en la misma lí­nea tienes que
> meter un TAB (chr(9)) y para separar las lí­neas un CRLF (chr(13)+chr(10)).
> P.ej., la cadena:
> "A1tB1tC1rnA2tB2tC2"
> dará lugar a una hoja así­:
> A1 B1 C1
> A2 B2 C2
Lo voy a intentar, aunque no es tan elegante, pero si funciona rapido, lo aplico.

> 2) Nunca apliques estilos celda a celda. Hazlo por rangos, por filas o por
> columnas. P.ej., si tienes una columna que muestra números y quieres que
> estén alineados a derecha y con una máscara concreta, usa el rango
> oExcel:oActiveSheet:Column( 3 )
>
> 3) Usa el comando WITH OBJECT todo lo que puedas. Así­ se evita invocar
> continuamente a las librerí­as de OLE. P.ej.:
> oExcel:ActiveSheet:Column( 3 ):Font:Name := "Arial"
> oExcel:ActiveSheet:Column( 3 ):Font:Size := 10
> llama a las librerí­as OLE unas 24 veces! En cambio:
> WITH OBJECT oExcel:ActiveSheet:Column( 3 ):Font
> :Name := "Arial"
> :Size := 10
> END
> llamarí­a unas 15 veces
Exactamente asi lo estoy haciendo, si notas el pequeño codigo que deje, ahora lo que si estoy aplicando formato por cada celda, probare una solucion por rango.
>
> La comunicación por OLE no es precí­samente un proceso muy rápido, pero estoy
> seguro que si aplicas correctamente estas técnicas (además de ocultar excel
> y no mostrarlo hasta que termine el proceso), conseguirás que tarde sólo
> unos segundos.
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>--
Gracias
Ramón Zea
ramonzea@yahoo.com
http://www.paginasprodigy.com/zeasoft/
--