TReport, TPrinter y TDOSPRN a Word
Posted: Mon Oct 04, 2010 10:02 pm
Saludos a toda la comunidad, hace unos dias atras se me ocurrio la idea de poder exportar todos los reportes de mi Sistema a Word, ya que anteriormente habia podido exportarlos a PDF y a Excel con la ayuda de las Clases TRep2XLS y PDFPRV (esta última de pago) , busque en este foro como poder realizarlo pero no ubique algo contundente, así que me di a la tarea de investigar mi cometido y encontre como hacerlo con la Clase TWord de Vikthor que esta en este foro: Se los comparto a todos uds.
Por favor si esto es un refrito de algo hecho por alguien más , que el Master Antonio Linares borre mi post para no hacer basura jejeje
Talvez mate pulgas a cañonazos pero es practico y funcional, no hay magia detras de todo esto. La idea es simple:
TReport y TPrint Generan los reportes en base a Imagenes EMF o Metafiles, mientras que en TDOSPRN es solo texto plano,
lo importante era ubicar donde se generaban estos archivos y como pasarlos a un formato simple. Lo logre con la utilidad "nconvert" que por la red encontraran...
Los cambios a las clases son minimos:
Para poder exportar a Word agregaremos un item al menu de la clase RPreview (rpreview.prg)
El Archivo que convierte de EMF a Word (TRep2Doc.prg)
En la clase TPrinter (printer.prg) hay que realizar unas modificaciones más que son las que se encargan de generar y borrar los archivos que necesitaremos para la conversión a Word.
Agregaremos al principio una variable STATIC "NPagEMF" para el control de las páginas creadas la iniciamos en 1 en el Metodo New y agregamos la orden BORRAemfS() para que nos borre los archivos temporales creados anteriormente por el generador de reportes, por si acason estuvieran creados:
En el metodo END() agregamos de nuevo la funcion
En el metodo _EndPage
y al final agregamos esta funcion para que nos borre los temporales a convertir
De todas maneras les dejo los archivos y el conversor para que puedan probarlo a los que les interese..
http://www.megaupload.com/?d=AAHRTM9L
y para TDosPRN solo hay que compiar el archivo generado a Doc
Espero les sea de Utilidad..
Por favor si esto es un refrito de algo hecho por alguien más , que el Master Antonio Linares borre mi post para no hacer basura jejeje
Talvez mate pulgas a cañonazos pero es practico y funcional, no hay magia detras de todo esto. La idea es simple:
TReport y TPrint Generan los reportes en base a Imagenes EMF o Metafiles, mientras que en TDOSPRN es solo texto plano,
lo importante era ubicar donde se generaban estos archivos y como pasarlos a un formato simple. Lo logre con la utilidad "nconvert" que por la red encontraran...
Los cambios a las clases son minimos:
Para poder exportar a Word agregaremos un item al menu de la clase RPreview (rpreview.prg)
- Code: Select all Expand view
- MENUITEM "&Exportar"
MENU
MENUITEM "Microsoft &Word" ACTION SaveAsDoc(oDevice,oDevice:cDocument) MESSAGE "Exportar Reporte a Microsoft Word" RESOURCE "Word"
ENDMENU
ENDMENU
El Archivo que convierte de EMF a Word (TRep2Doc.prg)
- Code: Select all Expand view
- #Include "FIVEWIN.CH"
#Include "DIRECTRY.CH"
/*
Funciones para pasar los Archivos EMF de la clase TReport a Word.
Víctor Daniel Cuatecatl Leon.
Soluciones y Diseño de Software Empresarial
http://www.soldisoft.sisa.unlugar.com
http://www.sisa.unlugar.com
Para correcciones mejoras y fallas: danyleon82@hotmail.com
*/
//-------------------------------------------------------------------------//
FUNCTION SaveAsDoc(oDevice,cTitRep)
LOCAL cNombreMS:= cGetFile( "Documento de Microsoft Office Word | *.DOC", "Guardar Reporte Exportado a Word", 1, "C:\", .T., .T.,,ALLTRIM(cTitRep))
LOCAL lLand:= IF( oDevice:GetOrientation() == 1,(.F.),(.T.) )
IF !EMPTY(cNombreMS)
cNombreMS += ".doc"
IF !FILE(".\NCONVERT.EXE")
MsgStop("No se encuentra el Convertidor.", "¡¡¡ Proceso Cancelado !!!")
ELSE
MsgRun( "Generando el Archivo de Word. Por Favor Espere... ", , {|| WAITRUN(CurDrive()+":\"+CurDir()+"\NCONVERT -overwrite -out jpeg "+CurDrive()+":\"+CurDir()+"\METAFILE\*.EMF",0), CreaWord(lLand,cNombreMS) })
ENDIF
ENDIF
ELSE
MsgStop("¡¡¡ Proceso Cancelado !!!", "No se Exporto el Archivo.")
ENDIF
RETURN nil
//-------------------------------------------------------------------------//
STATIC FUNCTION CreaWord(lLand,cNombreMS)
LOCAL oWord,N
LOCAL nDerLand:= 0
LOCAL nAbaLand:= 0
LOCAL aFiles:= DIRECTORY(CurDrive()+":\"+CurDir()+"\METAFILE\*.jpg")
oWord:=TWord():New()
oWord:NewDoc(cNombreMS)
oWord:SetCm()
IF lLand == .T.
oWord:SetLandScape()
nAbaLand:= 9
nDerLand:= 9
ENDIF
FOR N:= 1 TO LEN(aFiles)
oWord:StartPage()
oWord:AddImagen( 00,00,(30-nAbaLand),(21+nDerLand),CurDrive()+":\"+CurDir()+"\METAFILE\"+aFiles[N,1],{,,,1,,})
oWord:EndPage()
NEXT
oWord:SAVE()
oWord:END()
MsgInfo("El Archivo fue Exportado y Guardado con Exito en:"+CRLF+CRLF+cNombreMS, "Reporte Exportado")
RETURN nil
En la clase TPrinter (printer.prg) hay que realizar unas modificaciones más que son las que se encargan de generar y borrar los archivos que necesitaremos para la conversión a Word.
Agregaremos al principio una variable STATIC "NPagEMF" para el control de las páginas creadas la iniciamos en 1 en el Metodo New y agregamos la orden BORRAemfS() para que nos borre los archivos temporales creados anteriormente por el generador de reportes, por si acason estuvieran creados:
- Code: Select all Expand view
- STATIC NPagEMF
//----------------------------------------------------------------------------//
METHOD New( cDocument, lUser, lMeta, cModel, lModal, lSelection ) CLASS TPrinter
LOCAL aOffset
LOCAL cPrinter
DEFAULT cDocument := "FiveWin Report" ,;
lUser := .f., lMeta := .f., lModal := .f., lSelection := .f.
BorraEMFs()
NPagEMF:= 1
IF lUser
::hDC := GetPrintDC( GetActiveWindow(), lSelection, PrnGetPagNums() )
En el metodo END() agregamos de nuevo la funcion
- Code: Select all Expand view
- //----------------------------------------------------------------------------//
METHOD END()
...
...
...
ENDIF
oPrinter := nil
BorraEMFs()
RETURN nil
En el metodo _EndPage
- Code: Select all Expand view
- //----------------------------------------------------------------------------//
METHOD _EndPage() CLASS TPrinter
IF ::hDC = 0
RETURN nil
ENDIF
...
...
ELSE
EndPage( ::hDC )
ENDIF
IF !lIsDir( ".\METAFILE" )
MakeDir( ".\METAFILE" )
ENDIF
CopyFile( ATAIL(::aMeta), ".\METAFILE\" + SUBST(ALLTRIM(oApp:cUsuario[nItem]),1,4)+"_"+ALLTRIM(STRZERO(NPagEMF++,3))+".EMF" )
RETURN nil
y al final agregamos esta funcion para que nos borre los temporales a convertir
- Code: Select all Expand view
- //----------------------------------------------------------------------------//
STATIC FUNCTION BorraEMFs()
LOCAL aDirectorio
IF lIsDir(".\METAFILE")
aDirectorio := DIRECTORY(".\METAFILE\*.*", "D")
AEVAL( aDirectorio, {|aFichero| (FERASE(".\METAFILE\"+aFichero[F_NAME]), SysRefresh()) } )
lRMDir(".\METAFILE")
ENDIF
RETURN nil
De todas maneras les dejo los archivos y el conversor para que puedan probarlo a los que les interese..
http://www.megaupload.com/?d=AAHRTM9L
y para TDosPRN solo hay que compiar el archivo generado a Doc
- Code: Select all Expand view
- lzcopyfile("reporte.prn", "c:\reporte.doc")
Espero les sea de Utilidad..