Page 1 of 1

TReport, TPrinter y TDOSPRN a Word

PostPosted: Mon Oct 04, 2010 10:02 pm
by cuatecatl82
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) :cry: , 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 :x , que el Master Antonio Linares borre mi post para no hacer basura jejeje :lol:

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..

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Tue Oct 05, 2010 2:58 pm
by Adolfo
Gracias victor...

Lo probaremos para ver como anda...

Saludos desde Chile...

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Sun Oct 24, 2010 11:14 pm
by FranciscoA
Viktor, gracias por compartir tu trabajo.
Estoy asumiendo que lograste exportar a Excel con la class TPrinter. ¿Es así?. Si es afirmativo, ¿podrías compartir un pequeño ejemplo?.
Saludos.

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Tue Oct 26, 2010 4:15 pm
by cuatecatl82
Francisco gracias por tu comentario:

Así es, puedo exportar los reportes a Excel pero con la clase TRep2XLS ya que así es posible manipular las filas y columnas, y no toma los Metafiles para crear solo las pantallas directamente con TPrinter es algo complicado, por ahi leí que era posible con TExcelScript, pero por falta de tiempo no lo probe, leí la doc, pero era algo complicado.

Lo que todavia no es posible es exportar imagenes a Excel desde TRep2XLS, bueno, ami no me funciona...

Saludos..

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Thu Nov 04, 2010 4:11 am
by QAZWSX2K
Hola, dices que es via la clase tword, creo que es de Sebastian Almiron, del año 2002 y viktor le hizo y agrego mejoras en 2006, ahora no entiendo en que parte la usas, pq todo lo que explicas despues es con la tprinter, etc

yo uso y hago reportes directamente en tword, ahora bien como los paso a pdf, no uso para nada la tprinter o tprint, etc

que estes bien

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Fri Nov 05, 2010 12:25 am
by arturo tamayo
Bueno si estan buscando como esxportar a word desde código, de modo que todos los datos puedan ser modificados y controlados desde el propio word tal como lo hace la calse de ramon avendaño, es utilizando la generación de archivos RTF.

aqui tienen las fuentes

//*******************
//Arturo Tamayo Daza
//Clase para exportar a RTF paar word
//*******************
#include "FiveWin.ch"

//----------------------------------------------------------------------------//

CLASS TRtfArch

DATA hArch
DATA aBitmaps
DATA cArchName

METHOD New( cArchName ) CONSTRUCTOR

METHOD EsParr() INLINE FWrite( ::hArch, "\par "+ CRLF )

METHOD EsLine( cLong )

METHOD Write( xData, lCodesOK )

METHOD EsC14N( ) INLINE FWrite( ::hArch, "\plain\f0\fs14 "+CRLF )

METHOD EsC20B( ) INLINE FWrite( ::hArch, "\plain\f1\fs20\b "+CRLF )

METHOD EsA12N( ) INLINE FWrite( ::hArch, "\plain\f2\fs12 "+CRLF )

METHOD EsA12B( ) INLINE FWrite( ::hArch, "\plain\f2\fs12\b "+CRLF )

METHOD EsA14N( ) INLINE FWrite( ::hArch, "\plain\f2\fs14 "+CRLF )

METHOD EsA14B( ) INLINE FWrite( ::hArch, "\plain\f2\fs14\b "+CRLF )

METHOD EsA16N( ) INLINE FWrite( ::hArch, "\plain\f2\fs16 "+CRLF )

METHOD EsA16B( ) INLINE FWrite( ::hArch, "\plain\f2\fs16\b "+CRLF )

METHOD EsSura( ) INLINE FWrite( ::hArch, "\ul "+CRLF )

METHOD EsA20N( ) INLINE FWrite( ::hArch, "\plain\f2\fs20 "+CRLF )

METHOD EsA20B( ) INLINE FWrite( ::hArch, "\plain\f2\fs20\b "+CRLF )

METHOD EsCabe( ) INLINE FWrite( ::hArch, "{\header "+CRLF )

METHOD EndPar( ) INLINE FWrite( ::hArch, "\par }"+CRLF )

METHOD EsTitu( cLong )

METHOD EsSubt( cLong )

METHOD TabIni(clong) INLINE FWrite( ::hArch, "\deflang1034\pard"+clong+CRLF)

METHOD Borde(clong) INLINE FWrite( ::hArch, clong+CRLF)

METHOD IzqPar(clong) INLINE FWrite( ::hArch, "\qj\li"+clong+CRLF)

METHOD DerPar(clong) INLINE FWrite( ::hArch, "\ri"+clong+CRLF)

METHOD TabLine( nTab )

//INLINE FWrite( ::hArch, "\tab "+CRLF )

METHOD SalParr() INLINE FWrite( ::hArch, "\par\pard\plain\f2\fs20"+ CRLF )

METHOD NewPage() INLINE FWrite( ::hArch, "\page" + CRLF )
METHOD OpenGroup() INLINE FWRITE( ::hArch, "{" )
METHOD CloseGroup() INLINE FWRITE( ::hArch, "}" )

METHOD End()

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( cArchName ) CLASS TRtfarch

::cArchName = cArchName
// ::hArch = lCreat( cArchName )
::hArch = FCreate( cArchName )
::aBitmaps = {}

FWrite( ::hArch, "{\rtf1\ansi \deff0\deftab720" + CRLF + ;
"{\fonttbl" + CRLF + ;
"{\f0\fmodern Courier New;}" + CRLF + ;
"{\f1\fdecor Courier New;}" + CRLF + ;
"{\f2\fswiss Arial;}" + CRLF + ;
"{\f3\fswiss MS Sans Serif;}"+ CRLF + ;
"{\f4\froman MS Serif;}"+ CRLF + ;
"{\f5\froman Times New Roman;}}"+ CRLF + ;
"{\colortbl;" + CRLF + ;
"\red0\green0\blue0;" + CRLF + ;
"\red0\green0\blue127;"+ CRLF + ;
"\red0\green0\blue255;" + CRLF + ;
"\red0\green255\blue255;" + CRLF + ;
"\red0\green255\blue0;" + CRLF + ;
"\red255\green0\blue255;" + CRLF + ;
"\red255\green0\blue0;" + CRLF + ;
"\red255\green255\blue0;" + CRLF + ;
"\red255\green255\blue255;}" + CRLF )

return Self

//----------------------------------------------//
METHOD EsLine( cLong ) CLASS TRtfArch

local cLine, cChar
local n, nChar

cLine := cLong
for nChar = 1 to Len( cLine )
if Asc( cChar := SubStr( cLine, nChar, 1 ) ) > 127
FWrite( ::hArch, "\'" + C2Hex( cChar ) )
else
FWrite( ::hArch, cChar )
endif
next
FWrite( ::hArch, CRLF )

return nil

METHOD TabLine(ntab) CLASS TRtfArch
local nChar
for nchar = 1 to ntab
FWrite( ::hArch, "\tab "+CRLF )
next
Return nil
//--------------------------------------//
METHOD EsTitu( cLong ) CLASS TRtfArch

local cLine, cChar
local n, nChar

cLine := cLong
FWrite( ::hArch, "\par \qc\plain\f5\fs28\cf1\b " )
for nChar = 1 to Len( cLine )
if Asc( cChar := SubStr( cLine, nChar, 1 ) ) > 127
FWrite( ::hArch, "\'" + C2Hex( cChar ) )
else
FWrite( ::hArch, cChar )
endif
next
FWrite( ::hArch, CRLF )

return NIL
//----------------------------------------//
METHOD EsSubT( cLong ) CLASS TRtfArch

local cLine, cChar
local n, nChar

cLine := cLong
FWrite( ::hArch, "\par \plain\f5\fs20\cf1\b " )
for nChar = 1 to Len( cLine )
if Asc( cChar := SubStr( cLine, nChar, 1 ) ) > 127
FWrite( ::hArch, "\'" + C2Hex( cChar ) )
else
FWrite( ::hArch, cChar )
endif
next
FWrite( ::hArch, CRLF )

return nil

//----------------------------------------------------------------------------//

METHOD End() CLASS TRtfArch

local hHpj
local n
FWrite( ::hArch, "\par }" )
// lClose( ::hArch )
FClose( ::hArch )
return nil

METHOD Write( xData, lCodesOK ) CLASS TRtfArch
LOCAL cWrite := ""
LOCAL i, cChar, nChar
LOCAL cString := cValToChar( xData )
LOCAL aCodes := { "\", "{", "}" }
LOCAL aReturn := { CHR(13), CHR(10) }

DEFAULT lCodesOK := .F.

//IF ::lTrimSpaces
cString := RTRIM( cString )
//ENDIF

//cString := " " + cString

FOR i := 1 TO LEN(cString)

cChar := SUBSTR(cString, i, 1)
nChar := ASC(cChar)

IF nChar < 128

IF nChar > 91

// Process special RTF symbols
IF !lCodesOK
IF ASCAN( aCodes, cChar ) > 0
cChar := "\" + cChar
ENDIF
ENDIF

ELSEIF nChar < 33
IF nChar == 13 // Turn carriage returns into new paragraphs
cChar := "\par "
ELSEIF nChar == 10 // Ignore line feeds
LOOP
ENDIF
ENDIF

cWrite += cChar

ELSE
cWrite += "\'" + C2Hex( cChar )
ENDIF

NEXT

::OpenGroup()
FWRITE(::hArch, cWrite )
::CloseGroup()

RETURN NIL

Re: TReport, TPrinter y TDOSPRN a Word

PostPosted: Mon May 16, 2011 11:43 pm
by surGom
Me puedes indicar dónde puedo ver la clase TRep2XLS ya que me interesaría poder incluirla en mis preview, ya que utilizó la clase tprinter.

Luis