TReport, TPrinter y TDOSPRN a Word

TReport, TPrinter y TDOSPRN a Word

Postby cuatecatl82 » 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) :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  RUN
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  RUN
#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  RUN
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  RUN
//----------------------------------------------------------------------------//

METHOD END()

...
...
...

ENDIF

   oPrinter := nil

BorraEMFs()

RETURN nil


En el metodo _EndPage

Code: Select all  Expand view  RUN
//----------------------------------------------------------------------------//

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  RUN
//----------------------------------------------------------------------------//

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  RUN
lzcopyfile("reporte.prn", "c:\reporte.doc")


Espero les sea de Utilidad..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: TReport, TPrinter y TDOSPRN a Word

Postby Adolfo » Tue Oct 05, 2010 2:58 pm

Gracias victor...

Lo probaremos para ver como anda...

Saludos desde Chile...
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
User avatar
Adolfo
 
Posts: 860
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: TReport, TPrinter y TDOSPRN a Word

Postby FranciscoA » Sun Oct 24, 2010 11:14 pm

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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: TReport, TPrinter y TDOSPRN a Word

Postby cuatecatl82 » Tue Oct 26, 2010 4:15 pm

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..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: TReport, TPrinter y TDOSPRN a Word

Postby QAZWSX2K » Thu Nov 04, 2010 4:11 am

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
Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
User avatar
QAZWSX2K
 
Posts: 364
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas

Re: TReport, TPrinter y TDOSPRN a Word

Postby arturo tamayo » Fri Nov 05, 2010 12:25 am

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
arturo tamayo
 
Posts: 36
Joined: Fri Jan 02, 2009 3:12 pm

Re: TReport, TPrinter y TDOSPRN a Word

Postby surGom » Mon May 16, 2011 11:43 pm

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
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Lailton and 44 guests