Migrar datos de Word a VFP

559 views
Skip to first unread message

Mauricio Urquijo

unread,
Oct 7, 2017, 7:14:11 AM10/7/17
to Comunidad de Visual Foxpro en Español
Buenos días
Debo pasar muchos registros que están con el mismo formato en Word a una tabla de VFP. Alguien sabe dónde puedo encontrar algún ejemplo para saber cómo importar los datos desde VFP de una forma automatizada?
De antemano muchas gracias
Mauricio U

Fidel Charny

unread,
Oct 7, 2017, 9:00:12 AM10/7/17
to Comunidad de Visual Foxpro en Español
El procedure siguiente te permite leer un archivo de Microsoft Word ® y pasar los datos a un archivo de texto plano.
Luego habrá que ver cuales son las pautas para agregar datos.
Por ejemplo, si es para agregar a un campo Memo:
lcResp = Extract_MicrosoftWord_To_FileText()
IF NOT EMPTY(m.lcResp)
      CREATE CURSOR curpase (archivo c(60),comenta m)
       INSERT INTO curpase (archivo,comenta) VALUES (lcREsp,FILETOSTR(m.lcresp))
ENDIF


PROCEDURE Extract_MicrosoftWord_To_FileText
*!*    -----------------------------------------------------------------------------
*!*    Si se omiten todos los parámetros se buscará un archivo en tcFolder_Search
*!* Parameters
*!*    1    tcWord_Document:        Ruta + Nombre Archivo doc, docx
*!*    2    tcTargetFile:            Ruta + Nombre Archivo de texto (output)
*!*    3    tlTrimed:                (.t.) Quita leading and trailing spaces from lines
*!*    4    tlAddSpace:                (.t.) Agrega un espacio entre cada línea
*!*    5    tcFolder_Search            Carpeta de búsqueda. (MyDocuments por Defecto)
*!* 6    tlShow_FileText            (.t.) Muestra el archivo generado
*!*    -----------------------------------------------------------------------------
*!* Return
*!* El nombre del archivo de texto plano generado o una cadena vacía si hay error
*!*    -----------------------------------------------------------------------------
LPARAMETERS tcWord_Document
,tcTargetFile,tlTrimed,tlAddSpace,tcFolder_Search,tlShow_FileText

TRY
    LOCAL i
,;
        j
,;
        lcChar
,;
        lcde
,;
        lcEncabe
,;
        lcFooter
,;
        lcMyFolder
,;
        lcObten
,;
        lDoit
,;
        llAdd
,;
        lnAsc
,;
        loDocument AS
Object,;
        loWord AS
Object,;
        loWordBook AS
Object,;
        loWordErr
as Exception,;
        loForm AS
Object,;
        oWsh AS
Object,;
        loex
as Exception

       
    lcMyFolder
= FULLPATH("")

    IF VARTYPE
(m.tcFolder_Search)#"C" ;
        OR EMPTY
(m.tcFolder_Search) ;
        OR
!DIRECTORY(m.tcFolder_Search)
       
        oWsh
= CREATEOBJECT("WScript.Shell")
        tcFolder_Search
= oWsh.SpecialFolders("MyDocuments")
        owsh
=null    
       
    ENDIF    

    LOCAL ARRAY laValidChar
(34),;
        laParagraph
(1)

   
* Caracteres especiales admitidos
    laValidChar
[1]=153
    laValidChar
[2]=161
    laValidChar
[3]=166
    laValidChar
[4]=169
    laValidChar
[5]=171
    laValidChar
[6]=174
    laValidChar
[7]=187
    laValidChar
[8]=188
    laValidChar
[9]=189
    laValidChar
[10]=190
    laValidChar
[11]=191
    laValidChar
[12]=193
    laValidChar
[13]=196
    laValidChar
[14]=201
    laValidChar
[15]=203
    laValidChar
[16]=205
    laValidChar
[17]=207
    laValidChar
[18]=209
    laValidChar
[19]=211
    laValidChar
[20]=214
    laValidChar
[21]=218
    laValidChar
[22]=220
    laValidChar
[23]=225
    laValidChar
[24]=228
    laValidChar
[25]=233
    laValidChar
[26]=235
    laValidChar
[27]=237
    laValidChar
[28]=239
    laValidChar
[29]=241
    laValidChar
[30]=243
    laValidChar
[31]=246
    laValidChar
[32]=250
    laValidChar
[33]=252
    laValidChar
[34]=9

    IF EMPTY
(m.tcWord_Document)
        CD
&tcFolder_Search
        tcWord_Document
= GETFILE('docx;doc','&Nombre:','Abrir',0,'Abrir archivo Microsoft Word ®')
        CD
&lcMyFolder
       

    ENDIF
    lDoit
= !EMPTY(m.tcWord_Document)
    IF m
.lDoit
        TRY
            loWord
= CREATEOBJECT("Word.Application")
        CATCH TO loWordErr
            THROW
        FINALLY
            lDoit
= VARTYPE(loWord) = "O"
        ENDTRY
       
    ENDIF
    IF m
.lDoit

        tcTargetFile
=EVL(tcTargetFile,ADDBS(FULLPATH(""))+JUSTSTEM(tcWord_Document)+".txt")

        IF FILE
(m.tcTargetFile)
            DELETE FILE
&tcTargetFile
        ENDIF


        loForm
=NEWOBJECT("FORM")
        WITH loForm
           
.Width=CEILING(_Screen.width/3)
           
.Height=CEILING(_screen.Height/3)
           
.backColor=RGB(255,255,255)
           
.ForeColor=RGB(0,0,0)
           
.FontSize=8
           
.Caption="Importando "+JUSTFNAME(tcWord_Document)+" desde Microsoft Word ®"
           
.Alwaysontop=.t.
           
.autocenter=.t.
           
.Show()
        ENDWITH


       
? " Abriendo el documento "+JUSTFNAME(tcWord_Document)

        loWordBook
= loWord.Documents.Open(tcWord_Document)
        loWordBook
.Select
        loDocument
=loWord.ActiveDocument

       
*    With ActiveDocument.Sections(1)
       
*       .Headers(wdHeaderFooterPrimary).Range.Text = "Texto del encabezado"
       
*        .Footers(wdHeaderFooterPrimary).Range.Text = "Texto del pie de página"
       
*    End With

        STORE
"" TO lcEncabe,lcFooter
        WITH loDocument
.Sections(1)
            lcEncabe
=.Headers(1).range.text
            lcFooter
=.Footers(1).Range.text
        ENDWITH
       
? " "+ALLTRIM(lcEncabe)


        nParagraph
=loDocument.paragraphs.count
       
        IF
!EMPTY(m.nParagraph)
       
            lcde
="/"+TRANSFORM(nParagraph)
           
           
? " "
            DIMENSION laParagraph
(nParagraph)


            FOR i
=1 TO nParagraph
                IF i
=1  OR MOD(i,10)=0
                   
? " Leyendo Parágrafo "+TRANSFORM(i)+lcde+"..."+SPACE(10)
                ENDIF
               
                lcTexto
=loDocument.Paragraphs(i).Range.text

                lcObten
=""
                FOR j
=1 TO LEN(lcTexto)
                    lcChar
=SUBSTR(lcTexto,j,1)
                    lnASc
=ASC(lcChar)
                    llAdd
=.T.
                    DO
case
                           
                        CASE BETWEEN
(lnAsc,32,126)
                       

                        CASE ASCAN
(laValidChar,lnAsc)#0
                       
                        OTHERWISE

                            llAdd
=.F.
                    ENDCASE
                    IF llAdd
                       
LcObten=lcObten+lcChar
                    ENDIF
                   
                   
                   
                NEXT

                laParagraph
[i]=IIF(tlTrimed,ALLTRIM(lcObten),lcObTen)
            NEXT
           
? " Leyendo Parágrafo "+TRANSFORM(i-1)+lcde+"..."+SPACE(10)
        ENDIF

       
       
? " Escribiendo archivo de transferencia "+tcTargetFile+"..."

        lcString
= ""
        FOR i
= 1 TO nParagraph
            IF
!EMPTY(laParagraph[i])
                lcString
= m.lcString ;
                   
+ laParagraph[i] ;
                   
+ CHR(13) + CHR(10)
                IF m
.tlAddSpace
                    lcString
= m.lcString ;
                       
+ CHR(13) + CHR(10)
                ENDIF
            ENDIF
           
        NEXT

        STRTOFILE
(m.lcString,m.tcTargetFile,0)
       

       
? " Transferencia generada."

       
       
    ENDIF

CATCH TO LOEX
    LOEX
.USERVALUE = PROGRAM()
    SHOWERROR
(LOEX)
    tcTargetFile
= ""
FINALLY
    loForm
= null
    IF VARTYPE
(loWordBook)="O"
        loWordBook
.Close()
        IF VARTYPE
(loWord)="O"
            loWord
.Quit
        ENDIF
    ENDIF
    loDocument
= null
    loWordBook
= null
    loWord
= null
   
ENDTRY

IF
!EMPTY(m.tcTargetFile) AND !EMPTY(m.tlShow_FileText)
    TRY
        loex
= null
       
        DECLARE INTEGER
ShellExecute IN SHELL32.dll INTEGER nWinHandle,;
            STRING cOperation
,;
            STRING cFileName
,;
            STRING cParameters
,;
            STRING cDirectory
,;
            INTEGER nShowWindow
        DECLARE INTEGER
FindWindow IN WIN32API STRING cNull,;
            STRING cWinName


       
ShellExecute(FindWindow(0,_SCREEN.Caption),"Open",m.tcTargetFile,"",SYS(2023),1)
    CATCH TO loex
        loex
.UserValue = PROGRAM()
       
ShowError(loex)
    FINALLY
   
    ENDTRY
ENDIF

RETURN tcTargetFile

Fidel Charny

unread,
Oct 7, 2017, 9:03:23 AM10/7/17
to Comunidad de Visual Foxpro en Español
Bueno, ahí está la rutina en un adjunto.

           
.Alwaysontop=.t.<span style="color: #000;"
extract_msw.prg

Mauricio Urquijo

unread,
Oct 7, 2017, 9:14:29 AM10/7/17
to publice...@googlegroups.com
Muchísimas gracias Fidel, lo revisaré y adaptaré. Inmensamente agradecido.

Luis la Romana

unread,
Oct 7, 2017, 3:12:25 PM10/7/17
to Comunidad de Visual Foxpro en Español
Depende cómo esté el texto, si es tabular tablas tipo excel podría funcionar Guardar cómo txt (desde Word) y luego desde el zorrillo le das append from mifile.txt type sdf o con algún delimited.

Mauricio Urquijo

unread,
Oct 7, 2017, 3:29:46 PM10/7/17
to Comunidad de Visual Foxpro en Español
Hola Luis, estamos pensando construir un template en MS Word (los constructores de los archivos saben Word básico y no dominan el guardar como...) con una tabla incrustada para que en cada celda vaya un dato que a su vez se va a convertir en un campo de la tabla DBF. Me parece que así es más fácil la lectura de datos desde automatización con VFP.
Muchas gracias por tu respuesta

luis moran

unread,
Aug 24, 2018, 4:46:27 PM8/24/18
to Comunidad de Visual Foxpro en Español

Alexander Mendoza

unread,
Oct 23, 2022, 9:22:53 AM10/23/22
to Comunidad de Visual Foxpro en Español
Opcion1:
Envio_al_encabezado = 'loWord.ActiveDocument.Sections(1).headers(1).Range()'
THISFORM.lfbuscareplacadena(&Envio_al_encabezado, "<<TextoBuscado>>", '005/2020')

Envio_al_Cuerpo = 'loWord.Selection'
THISFORM.lfbuscareplacadena(&Envio_al_Cuerpo,       "<<TextoBuscado>>", '006/2020')

Opcion 2:
THISFORM.lfbuscareplacadena(loWord.ActiveDocument.Sections(1).headers(1).Range(), "<<TextoBuscado>>", '005/2020')
THISFORM.lfbuscareplacadena(loWord.Selection,                       "<<TextoBuscado>>", '006/2020')
Reply all
Reply to author
Forward
Message has been deleted
0 new messages