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
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Exportar a Excel len......to
Exportar a Excel len......to
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
> 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
-
- Mensajes: 620
- Registrado: Jue Mar 23, 2006 2:39 am
Exportar a Excel len......to
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.
--
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.
--
-
- Mensajes: 1831
- Registrado: Mar Oct 11, 2005 9:53 am
Exportar a Excel len......to
"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/
--
> 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/
--
Ramón Zea
Móvil: 01-993-231-62-29
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoftware/
Móvil: 01-993-231-62-29
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoftware/