Automatizacion Word

870 views
Skip to first unread message

Jose Olortegui

unread,
Oct 28, 2014, 5:28:50 AM10/28/14
to mundovis...@googlegroups.com
Hola Foxeros. Una consulta :
Tengo un archivo llamado PRE_FORMATO.DBF, donde el campo memo llamado TEXTO,
debo copiar cada registro memo a Word, he conseguido copiar solo como tablas. Y como veran,
me crea un documento word con tablas (varias celdas)
Lo que no se es como hacerlo como PARRAFOS en word. Por que el documento que genere en word
su interlineado es muy alto, y en parrafos es menos de altura.

Adjunto todos los archivos por si alguien le sirva en tablas de word
Y espero si alguien me podria ayudar en parrafos en word. Uso Visual Foxpro 7.
Desde ya muchas gracias foxeros.

Jose Olortegui
doc_varios.SCT
doc_varios.scx
pre_formato.cdx
pre_formato.dbf
pre_formato.fpt

CORP TEG SAC

unread,
Oct 28, 2014, 7:37:09 AM10/28/14
to mundovis...@googlegroups.com
Espero te sirva este codigo es de generar cartas a clientes

Public oWord
#define cr chr(13)
oLista = ThisForm.lstDestinatarios
* Contamos el número de páginas (una por 
* cada registro seleccionado)
lnNumPag = 0
For lnLine = 1 To oLista.ListCount
  lnNumPag = lnNumPag+;
    +IIF(oLista.Selected(lnLine),1,0)
EndFor

* Comprobamos que hemos seleccionado
* al menos un registro
If lnNumPag = 0
  MessageBox("No hay registros ;
seleccionados",64,"Aviso")
  Return
EndIf

* instanciamos el Word
Wait Wind "Abriendo sesión Word" NoWait
oWord = CreateObject('word.application')

* si no se ha podido crear el objeto   
* salimos del método
If Type('oWord') # 'O'
   Return
EndIf   

* creamos documento nuevo
oWord.Documents.Add()
oWord.caption='Prueba OLE con Word'

lnPagina = 1
For lnLine = 1 To oLista.ListCount
 If oLista.Selected(lnLine)
  Wait Wind "Generando documento:;
    Página "+allt(str(lnPagina))+;
    " de "+allt(str(lnNumPag)) NoWait
  
**  creamos la cabecera de carta a
**  clientes con los datos de las tablas
    Select cTipo
    Locate for ;
       codigo = oLista.List(lnLine,1)
       lcCabecera = nombre
           
    lcSaludo = "Estimado/a " +;
         nombre

  * Insertar cabecera       
 oWord.Selection.InsertAfter(lcCabecera)

* Insertamos líneas en blanco y fecha
 lcEspacio = REPLICATE(cr,12)
 oWord.Selection.InsertAfter(lcEspacio)
 oWord.Selection.InsertAfter('Fecha: ')
 oWord.ActiveDocument.Bookmarks.add("fecha")
 lcEspacio = REPLICATE(cr,3)
 oWord.Selection.InsertAfter(lcEspacio)
 oWord.ActiveDocument.Bookmarks.add("saludo")
 oWord.Selection.InsertAfter(lcEspacio)
 oWord.ActiveDocument.Bookmarks.add("cuerpo")
 oWord.selection.Bookmarks('fecha').Select
 oWord.selection.InsertAfter(date())
 oWord.selection.Bookmarks('saludo').select
 oWord.selection.InsertAfter(lcSaludo+lcEspacio)
** Insertamos el texto de la carta que   especificamos en el Editbox
 lcCuerpo = ThisForm.edtCarta.Value
 oWord.selection.Bookmarks('cuerpo').select
 oWord.selection.InsertAfter(lcCuerpo+cr)
 oWord.Selection.InsertAfter(lcEspacio+lcEspacio)
 oWord.selection.InsertAfter('Un cordial ;
    saludo,'+cr)
 oWord.Selection.InsertAfter(lcEspacio)
 oWord.selection.InsertAfter(repl('_',25))
 oWord.Selection.InsertAfter(cr)
 oWord.selection.InsertAfter('Fdo.: Pepe;
    Pérez')
** Insertamos un salto de página si no  estamos en la última página
  If lnPagina < lnNumPag
    oWord.Selection.InsertAfter(CHR(12))
  EndIf           
  Start=oWord.selection.Bookmarks('fecha').select
  End = oWord.ActiveDocument.;
    Bookmarks("\ENDOFDOC").select
  lnPagina = lnPagina +1
 EndIf
EndFor
* especificamos las dimensiones de la ;
  ventana word
oWord.top = 1
oWord.left = 1
oWord.width = 300       
oWord.height = 400       

MessageBox("Proceso concluido",64,"Aviso")
ThisForm.Refresh()

Fidel Charny

unread,
Oct 28, 2014, 7:41:43 AM10/28/14
to mundovis...@googlegroups.com
Intenta con lo siguiente
lcTexto="Frase que se se tiene que pasar a un parágrafo de Microsoft Word".
lOWord = CREATEOBJECT("Word.Application")
lodoc=loWord.ActiveDocument
with loDoc.Content
.InsertAfter(lcTexto)
.InsertParagraphAfter     
endwith

En lugar de lcTexto utiliza un array con todos los parágrafos que correspondan. 
Para configurar los parágrafos, puedes utilizar
with loDoc.Paragraphs
.LIneSpacingrule=4               && tipo de espaciado, en este caso "exacto"
.LineSpacing=nDefSpace      && alto de la linea
.SpaceBefore=nDefArriba    && espacios antes del parágrafo  
.SpaceAfter=nDefAbajo         && espacios después del parágrafo.
endwith

Si en el array defines también LineSpacing, SpaceBefore y SpaceAfter, puedes recorrer todos los parágrafos insertados con
For i=1 to alen(aArray,1)
        with loDoc.Paragraphs(i)
               && acá va lo mismo que antes, pero ajustado a la posición del array que corresponda.
               && puedes definir un default y ajustar cada valor con Evl(array[i,j],lnDefaul

       endwith
endfor

CORP TEG SAC

unread,
Oct 28, 2014, 7:46:11 AM10/28/14
to mundovis...@googlegroups.com
aqui otro codigo cunado trabajs con plantillas y deseas remplazar variables en word      

 loWord.Documents.open(gcDirectory +'PLANTILLA\INFORME',,.f., ,'','')
                   
                    loRange = loWord.ActiveDocument.range()
                    Wait Wind "Generando documento..." + lcDes_doc + lcNumero  NoWait
                    fn_BuscaReplaCadena(loWord.Selection, "xOfi", allt(lcDes_Amb))                   
                    fn_BuscaReplaCadena(loWord.Selection, "xNUM", allt(lcNumero))
                    fn_BuscaReplaCadena(loWord.Selection, "xDe", lcDe)
                    fn_BuscaReplaCadena(loWord.Selection, "xCar_de",lcU_O_D)
                    fn_BuscaReplaCadena(loWord.Selection, "xPara",lcA)
                    fn_BuscaReplaCadena(loWord.Selection, "xCar_pa",lcU_O_A)
                    fn_BuscaReplaCadena(loWord.Selection, "xAsunto",lcAsunto)
           

*----------------------------------------------------------------------------------------------------------
PARA TU CAMPO MEMO COMO SON PARRAFOS YA NO REMPLACES
*----------------------------------------------------------------------------------------------------------

      with loWord.selection   
                          lcCuerpo = 'zxxxxx' tu campo memo                                                                   
                         .MoveDown(5,17) && mueve a una posicion del puntero en word donde quiras solo juega con los numeros
                         .TypeText(lcCuerpo)
                         .ParagraphFormat.LineSpacingRule = 1                                             
          endwith


*----------------------------------------------------------
*-BUSCADOR DE WORD Y REMPLAZAR VARIABLES
*---------------------------------------------------------
FUNCTION fn_BuscaReplaCadena
 
    LPARAMETERS poSelection, pcValueToFind, pcValueToReplace
    LOCAL llReturn
     
    llReturn = .t.
     
    TRY
      WITH poSelection.Find
             .ClearFormatting
             .Replacement.ClearFormatting
             .Text = pcValueToFind
              .Replacement.Text = pcValueToReplace
             *.TypeText(pcValueToReplace)
             .Forward = .T.
             .Wrap= 1
             .Execute(,,,,,,,,,,2)
      ENDWITH
    CATCH TO nError     
        llReturn = .F.
        THIS.cDescUltError = 'Ha ocurrido un error en el proceso de reemplazo de texto'
    ENDTRY
     
    RETURN (llReturn)
   
ENDFUNC


Jose Olortegui

unread,
Oct 28, 2014, 10:42:11 AM10/28/14
to mundovis...@googlegroups.com
Muchas gracias a todos los foxeros por sus ideas y prontas respuestas
Vamos Foxpro !!!!


Saludos y exitos a todos
Jose Olortegui
desde Paraguay
Reply all
Reply to author
Forward
0 new messages