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