FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posted: Sat May 08, 2010 04: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.

Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posted: Sat May 08, 2010 01:45 PM

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

Saludos,

George

Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posted: Sat May 08, 2010 05: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.

Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posted: Sat May 08, 2010 05: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
Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Re: ¿¿¿Generar reporte de 100+ páginas en Excel en 4 segundos???
Posted: Sat May 08, 2010 06: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

Continue the discussion