¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

Postby César E. Lozada » Sat May 08, 2010 4:18 am

... con celdas con formatos, configuración de páginas, imagenes incrustadas, etc?

Yes, you can!

Fue relativamente sencillo escribir una clase como tExcel que haga esto como si hubiera usado tOleAuto32 pero sin la lentitud de éste!!!

Les paso el dato:

OLEXlsFile en http://www.sm-software.com (Hay un demo totalmente funcional para escritura aunque restringida para lectura, cosa que también hace a la velocidad de un rayo)

Una verdadera maravilla!!!.

NOTA: ES SOLO INFORMACIÓN PARA LA COMUNIDAD - NO CONFUNDIR CON PUBLICIDAD - NO TENGO NINGUNA RELACIÓN CON EL VENDEDOR.
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

Postby George » Sat May 08, 2010 1:45 pm

Excelente informacion Cesar.
No puede poner un ejemplo de como lo usaste con FWH?

Saludos,

George
George
 
Posts: 724
Joined: Tue Oct 18, 2005 6:49 pm

Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

Postby César E. Lozada » Sat May 08, 2010 5:13 pm

La historia comienza así:

*------------------------------------------------
METHOD New(cXlsFile,nSheets,cPathDll,lInfo) CLASS tOleXlsFile
Local n
DEFAULT nSheets:=1
DEFAULT cPathDll:=cAppPath()
DEFAULT lInfo:=.T.

BYNAME cPathDll, lInfo
IF !::LoadDll()
return Self
ENDIF

cXlsFile:=cFullFileName(cXlsFile)
BYNAME cXlsFile
::oWorkBook := ::oXlsFile:XLSFile:Workbook
::nDateFormat:=::oWorkbook:FormatStrings:AddFormat(::cDateFormat)
::oWorkbook:Sheets(1):Name := "Hoja1"


for n:=2 to nSheets
::SheetAdd()
next

::SheetSelect(1)
::SheetInit()

return Self
*------------------------------------------------
METHOD LoadDll() CLASS tOleXlsFile
Local cDll
cDll:=::cPathDll+"\olexlsf.dll"
TRY
::oXlsFile:=CreateObject("olexlsf.XLSFileObject")
CATCH
::lError:=.T.
END
IF ::lError
IF !File(cDll)
MsgAlert("No está "+cDll)
ELSE
TRY
WaitRun("regsvr32 "+["]+cDll+["]+" /s")
SysRefresh()
::oXlsFile:=CreateObject("olexlsf.XLSFileObject")
::lError:=.F.
CATCH
MsgAlert("No se pudo cargar "+cDll)
END
ENDIF
ENDIF
IF !::lError
::oStyleNormal := tXlsStyle():New()
::oStyleTitle := tXlsStyle():New({"FontHeight" =>12, "FontBold" => .T., "Merged"=>.T., "HAlign"=>xlHAlignCenter})
::oStyleHeader := tXlsStyle():New({"cBorders" => "TB",;
"nBordersStyle" => bsThin,;
"FillPattern" => xlPatternSolid,;
"FillPatternBGColorIndex" => xlColorGray25})
ENDIF
return !::lError

donde tXlsStyle es una clase que define define los estilos o formatos de un grupo de celdas.

Aprovecho también para compartir con todos ustedes una metodología que aprendí, examinando algunos programas en PHP, para el paso de parámetros a un método de una clase, aunque también podría ser aplicable a funciones o procedimientos. Nótese que, en vez de pasar muchos parámetros a un método en un orden que debo conocer a la perfección, envío un único parámetro tipo Hash(). El método que los recibe entonces sólo tiene que verificar si los keys enviados en el hash son DATA de la clase, caso en el cual le asigna el valor del hash o lo ignora si no lo es.
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

Postby Patricio Avalos Aguirre » Sat May 08, 2010 5:30 pm

hola Cesar

lo ultimo que los parametros que envias a traves de hash?
podrias explicar un poco y dar un par de ejemplos

gracias
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1059
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???

Postby César E. Lozada » Sat May 08, 2010 6:21 pm

Con mucho gusto.

Para la clase de abajo puedo hacer:

oTest:=tTest():New( {"aValue"=>{1,2,3}, "nWidth"=>50, "cPicture"=>"@Z99", "nClrPane"=>CLR_WHITE, "bAction"=>{|| msgInfo("Ok")}, "cTEXT"=>"Prueba"})
un sólo parámetro y sin tener que seguir un determinado orden (solo recordar saber que DATAs quiero inicializar).

CLASS tTest
DATA oWnd
DATA cText INIT ""
DATA nWidth,nHeight
DATA nClrText,nClrPane
DATA bAction,cPicture,bWhen

DATA aValue INIT {}
etc...
METHOD New(hProp) CONSTRUCTOR
ENDCLASS

METHOD New(hProp)
Local aProp, cProp
IF ValType(hProp)="H"
aProp:=HGetKeys(hProp)
FOR EACH cProp IN aProp
TRY
oSend(Self,"_"+cProp,hProp[cProp])
CATCH
END
NEXT
ENDIF
return Self
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 78 guests