Jump to content


Photo

Cambiar Texto en un Cuadro de Texto de un Archivo de MS Word


  • Please log in to reply
18 replies to this topic

#1 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 04 June 2012 - 04:28 AM

Hola amigos,

Estoy manipulando archivos de Word, soy capaz e buscar y reemplazar Texto y hacer el mismo con tablas insertando el texto que deseo o lo cambiando en la Celda que me apetezca.
Pero tengo un documento que está lleno de Cuadros de Texto adonde la busqueda por el texto no me funciona y tengo que manipular el texto dentro de los mismos.
Estoy ya toda la mañana intentando localizar como hacerlo y no soy capaz.
Alguien tiene idea de como puedo manipular cuadros de texto en MS Word ?
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 04 June 2012 - 07:31 AM

Word es muy rarito en eso, el contenido del document es el texto puro, pero la cabecera, pie de pagina, y los posibles cuadros de texto, son todo "cosas aparte" y han de ser manipuladas pasandote por cada una y pidiendoselo por favor.

Mirate esto (y tiembla): http://word.mvps.org...aceAnywhere.htm
  • 0

#3 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 04 June 2012 - 08:02 AM

Gracias Sergio !!! Me había topado con ese material pero me parecía una chapuza pasar por toda las partes de la documentación si pudiera acceder a el elemento que deseaba, tal y como ocurre con los elementos Table que sí puedes referenciar directamente y sólo diciendo si es la primera, segunda... tabla.
Espero que OpenOffice sea más listo para se dejar manipular.

Gracia amigo. Grandes abrazos !!!
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 04 June 2012 - 09:37 AM

Yo también trabajo con documentos de OpenOffice, y estas cosas son más... racionales que en MS, por decirlo suavemente.

Un fichero .odt de OpenOffice lo puedes abrir como un .zip, modificar los .txt que lleve dentro cambiandoles palabras, y listo, busca y sustituye sin  instalar la aplicación!

Si usas OpenOffice para abrir los .doc, podrás -creo- cambiar el texto sin problemas, esta "rareza" es exclusiva de Word por lo que yo sé, pero al guardarlo de nuevo en .doc te arriesgas a que algún detalle del formato se cambie, en especial si incluye fórmulas, gráficos y esas cosas.

Hazte antes un par de pruebas -o más- de abrir y guardar con OO ficheros típicos de la aplicación, y luego abrirlos con office a ver si algo se te ha cambiado (y usa siempre la versión más actual de openoffice, estos temas los mejoran muy activamente).
  • 0

#5 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 05 June 2012 - 12:55 AM

Yo también trabajo con documentos de OpenOffice, y estas cosas son más... racionales que en MS, por decirlo suavemente.

Un fichero .odt de OpenOffice lo puedes abrir como un .zip, modificar los .txt que lleve dentro cambiandoles palabras, y listo, busca y sustituye sin  instalar la aplicación!

Si usas OpenOffice para abrir los .doc, podrás -creo- cambiar el texto sin problemas, esta "rareza" es exclusiva de Word por lo que yo sé, pero al guardarlo de nuevo en .doc te arriesgas a que algún detalle del formato se cambie, en especial si incluye fórmulas, gráficos y esas cosas.

Hazte antes un par de pruebas -o más- de abrir y guardar con OO ficheros típicos de la aplicación, y luego abrirlos con office a ver si algo se te ha cambiado (y usa siempre la versión más actual de openoffice, estos temas los mejoran muy activamente).


Me encantó por como lo has descrito Sergio !!! Un amigo que programa con Python bastante activamente para OO ya me había comentado que era un gusto manipular información en documentos .odt, pero la verdad como apenas empiezo no sabía bien los porques de eso. Creo que tu me has ya dado una idea más exacta del porque. Gracias !!!  :D
  • 0

#6 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 05 June 2012 - 02:27 AM

Como el Delphi 7 no tiene For Each pues estoy intentando hacer el código de VB que me ha aportado Sergio así:



delphi
  1. for i:=0 to Word.ActiveDocument.StoryRanges.Count do
  2. begin
  3.         Texto:=Word.ActiveDocument.StoryRanges.Item(i).Find;
  4.         Texto.ClearFormatting;
  5.         Texto.Text:='Certificado';
  6.         Texto.Replacement.ClearFormatting;
  7.         Texto.Replacement.Text:= Texto.Text + DataModule1.IBQueryParticipantesCursoxCliente.FieldByName('EMP_NOMBRE').AsString;
  8. end;



Pero siempre me salta el error : "Ele elemento del conjunto solicitado no existe"

Ya he comprobado que a pesar que el Count me dice que tiene 6 elementos, sólo encuentra algo en los elementos 1 y 5, los otros me sale el mismo.

Alguien tiene idea de como puedo hacer el código en Delphi 7 ?
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 05 June 2012 - 03:09 AM

Te has ofuscado con lo dificil de buscar y reemplazar que has caido en lo más sencillo: si el for empieza por 0, termina por count-1 !!!
  • 0

#8 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 05 June 2012 - 05:05 AM

Te has ofuscado con lo dificil de buscar y reemplazar que has caido en lo más sencillo: si el for empieza por 0, termina por count-1 !!!


Ya llevas razón el que código que subí ya es uno de andar me rompiendo la cabeza probando. Ya o hice empezando de 1 y el mismo.
De hecho por los cambios que hace ya salta en el primer valor que no encuentra.
El Forecha no utiliza un índice, sencillamente va cambiando para el siguiente Range, pero como Delphi 7 (el que utilizo) no sporta ForEach, pues fue como me lo ingenié para intentar hacerlo.
Por lo visto no funciona para recorrer todo el documento ir saltando por los items con un índice.
Tu cuando buscas por un estrucutra de los docs, como los haces ?
Agradezco cualquier ayuda.

Abrazos,

Felipe

  • 0

#9 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 06 June 2012 - 05:31 AM

Mirate esta pagina: http://msdn.microsof...office.11).aspx sobre todo el código del final en "reamrks", y también esta otra http://msdn.microsof...ice.11).aspx#Y0

Por lo que parece, lo correcto sería pedirle al document el storyrange de todos los cuadros de textos (parece que todos forman un solo story) así:

Range:= ActiveDocument.StoryRanges.Items( wdTextFrameStory );

Donde la constante la puedes "adivinar" con una macro de word que te la muestra en un menasaje o algo así (o quizas en word.pas, yo nunca he usado estas unidades).

Y luego tendrías que ir iterando por todos los rangos (cuadros de texto) de esta colección, usand lo del next:



delphi
  1. Range:= ActiveDocument.StoryRanges.Items( wdTextFrameStory );
  2. //Haces el find en este primer cuadro de texto
  3. While Assigned(Range.NextStoryRange) do begin
  4.   Range:= Range.NextStoryRange;
  5.   //Repites el find en este cuadro de texto
  6. end;



Todo esto esta sin comproblarlo, te toca hacer pruebas y ver si funciona o no, pero algo es algo!

Eso si, cuando te funciuone pon el código que a mi por lo menos me guastaría hacerle un copy-paste!
  • 0

#10 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 06 June 2012 - 05:42 AM

Voy probar Sergio, si no es hoy mañana te lo comento. Gracias de nuevo, me has aportado una luz por lo menos, ya no sabía lo que probar y de hecho me puse haciendo otras cosas.

Abrazos amigo.
  • 0

#11 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 06 June 2012 - 08:30 AM

Sergio eres un crack, la X de la cuestión era como dar los saltos entre los elementos y me lo has aportado !!!
Tuve que cambiar 2 cosillas pero me va perfecto, eso que el dichosos documento otra cosa no tiene, pero campos de texto y imágenes... pues a patadas.
Ahí va el código, espero que te sea útil como me ha sido y que todos amigos del Foro que siempre me ayudan se sienta a gusto de hacer vuestros copy/paste


delphi
  1. //Contenedor es una variable de tipo Range
  2. //Word es como he llamado el objeto TWordApplication que tienes que insertar en tu formulario para trabajar con Word
  3.    
  4.     //Pillar el primero Range que sea del tipo TextFrame del Story del documento
  5.     Contenedor:= Word.ActiveDocument.StoryRanges.Item(wdTextFrameStory);
  6.     //Código para buscar dentro de ese Range el texto buscado, sustituirlo por el que texto deseado y guardar el documento
  7.     Texto:=Contenedor.Find;
  8.     Texto.ClearFormatting;
  9.     Texto.Text:='D. /Dña.:';
  10.     Texto.Replacement.ClearFormatting;
  11.     Texto.Replacement.Text:= Texto.Text + DataModule1.IBQueryParticipantesCursoxCliente.FieldByName('EMP_NOMBRE').AsString;
  12.     orden:=1;
  13.     Texto.Execute(EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  14.             EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  15.             orden, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  16.     Word.ActiveDocument.Save;
  17.     //Bucle que chequea si el proximo Range está Asignado o no
  18.     While Assigned(Prueba.NextStoryRange) do
  19.     begin
  20.       //Saltar para el siguiente Range volver a hacer la búsqueda en el mismo y guardar 3el documento
  21.       Contenedor:= Contenedor.NextStoryRange;
  22.       Texto:=Contenedor.Find;
  23.       Texto.ClearFormatting;
  24.       Texto.Text:='D. /Dña.:';
  25.       Texto.Replacement.ClearFormatting;
  26.       Texto.Replacement.Text:= Texto.Text + DataModule1.IBQueryParticipantesCursoxCliente.FieldByName('EMP_NOMBRE').AsString;
  27.       orden:=1;
  28.       Texto.Execute(EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  29.             EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  30.             orden, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  31.       Word.ActiveDocument.Save;
  32.     end;
  33.     //Cerrar y guardar el documento
  34.     Word.Quit;
  35.     Word.Disconnect;


  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 06 June 2012 - 11:38 AM

Grácias por el código final!

De todas formas, al menos echo en falta la declaración de la constante wdTextFrameStory, quizas la toma de la unidad de definiciones de word, excel, etc., ya te digo que nnuca la he usado ¿sabes el valor como integer (me ahorro buscarlo yo, je je)?
  • 0

#13 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 07 June 2012 - 01:15 AM

Hola Sergio. A mi tb se me hizo raro, de hecho nunca me lo imaginaria que irían por ahí los tiros con ese variable. Creo que lo pilla de las definiciones de la api de word.
Sobre tu otra pregunta hice la prueba


delphi
  1. Contenedor:= Word.ActiveDocument.StoryRanges.Item(wdTextFrameStory);
  2. ShowMessage(IntToStr(wdTextFrameStory));



Para el caso de ese documento en el cual trabajo me salió 5.
Pero por lo que entendí eso va a variar según el documento, pq creo que ese seria el quinto Range del Story del documento Activo.
  • 0

#14 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 07 June 2012 - 01:19 AM

Sergio,

Aprovecho el post y pregunto:
Sabes como puedo buscar un texto, ir al final de esa posición y insertar un texto (no cambiarlo) ?
Comento porque con el código que tengo ahora lo logro hacer, pero el tema es que el testo que quiero insertar tiene un formato de fuente, negrita, etc. distinto al que tiene. Con el Replace el me pilla toda la formatación.
Tienes idea de como hacerlo ?

  • 0

#15 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 07 June 2012 - 01:51 AM

Hola Sergio. A mi tb se me hizo raro, de hecho nunca me lo imaginaria que irían por ahí los tiros con ese variable. Creo que lo pilla de las definiciones de la api de word.
Sobre tu otra pregunta hice la prueba


delphi
  1. Contenedor:= Word.ActiveDocument.StoryRanges.Item(wdTextFrameStory);
  2. ShowMessage(IntToStr(wdTextFrameStory));



Para el caso de ese documento en el cual trabajo me salió 5.
Pero por lo que entendí eso va a variar según el documento, pq creo que ese seria el quinto Range del Story del documento Activo.


Es una constante, por eso al principio no funcionaban las cosas: Tienes varias "zonas", el cuerpo, el pie, la cabeza, los frames de texto, cada una de estas "zonas" tiene su constante, y usando la constante localizas el primer cuadro de texto de tu documento, o el primer pie de pagina, y luego vas saltando a los adicionales con el findnext.

Asi que la lista de storys es de una longitud máxima pequeña, 6 u 8, pero de cada story cuelga una lista de zonas de esa familia.
  • 0

#16 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 07 June 2012 - 02:19 AM

Sergio,

Aprovecho el post y pregunto:
Sabes como puedo buscar un texto, ir al final de esa posición y insertar un texto (no cambiarlo) ?
Comento porque con el código que tengo ahora lo logro hacer, pero el tema es que el testo que quiero insertar tiene un formato de fuente, negrita, etc. distinto al que tiene. Con el Replace el me pilla toda la formatación.
Tienes idea de como hacerlo ?


Yo, para cambiar texto, uso solamente una línea de código:



delphi
  1. Word.ActiveDocument.Content.Find.Execute(SearchTxt, true, false, false, false, false,,,, ReplaceTxt, SearchAll);



Y con esa línea no le paso nada de formateo, el texto se cambia tal cual este ese párrafo (negrita o lo que sea), así que si quieres escribir " el que lo lea" despues de encontrar la palabra "tonto", yo lo suelo hacer esto:

1) Cambio 'tonto' por '<@@> el que lo lea'
2) Cambio '<@@>' por 'tonto'

Lo hago en dos fases por evitar posibles bucles (tonto -> tonto el que lo lea -> tonto el que lo lea el que lo lea -> etc) aunque supongo que word es más listo que eso... pero yo siempre uso cambios que no creen bucles!

Aqui el truco es que "escribir una cosa despues de encontrar la palabra 'tonto'" es igual que "cambiar 'tonto' por 'tonto el que lo lea'".
  • 0

#17 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 07 June 2012 - 02:36 AM


Yo, para cambiar texto, uso solamente una línea de código:



delphi
  1. Word.ActiveDocument.Content.Find.Execute(SearchTxt, true, false, false, false, false,,,, ReplaceTxt, SearchAll);



Y con esa línea no le paso nada de formateo, el texto se cambia tal cual este ese párrafo (negrita o lo que sea), así que si quieres escribir " el que lo lea" despues de encontrar la palabra "tonto", yo lo suelo hacer esto:

1) Cambio 'tonto' por '<@@> el que lo lea'
2) Cambio '<@@>' por 'tonto'

Lo hago en dos fases por evitar posibles bucles (tonto -> tonto el que lo lea -> tonto el que lo lea el que lo lea -> etc) aunque supongo que word es más listo que eso... pero yo siempre uso cambios que no creen bucles!

Aqui el truco es que "escribir una cosa despues de encontrar la palabra 'tonto'" es igual que "cambiar 'tonto' por 'tonto el que lo lea'".


Vale eso el mio tb lo hace (aun que voy probar con la tuya, me pareció más elegante), el tema es no quiero mantener la formatación, sencillamente porque el anterior tiene negrita y el texto a ser insertado no tiene negrita.
O sea quiero meter texto con la formatación que yo prefiera.
Cuando descubrí como hacer las búsqueda sin perder formato del documento así me ha salido, no topé como insertar después de la posición donde el encuentra el texto buscado, que es el ideal y así ya miré algún ejemplo de como pasar el formato deseado para el texto. Pero como ponerlo en esa posición y hacer la inserción no he sido capaz.
  • 0

#18 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 07 June 2012 - 06:48 AM

Aparte de que insertar después de algo es como buscar y sustituir con el truco que te comenté, si quieres saber como insertar texto con formato, yo siempre empiezo intentando grabar en word una macro que haga exactamente eso, y luego la estudio a ver como lo grabo word... no siempre ayuda, pero muchas veces te dá la clave.

Hace ya años que desterré word y excel de mis pc, incluidos los del trabajo, así que en esta ocasión no te puedo ayudar mucho más!

  • 0

#19 coruxito

coruxito

    Advanced Member

  • Miembros
  • PipPipPip
  • 55 posts

Posted 08 June 2012 - 12:54 AM

Aparte de que insertar después de algo es como buscar y sustituir con el truco que te comenté, si quieres saber como insertar texto con formato, yo siempre empiezo intentando grabar en word una macro que haga exactamente eso, y luego la estudio a ver como lo grabo word... no siempre ayuda, pero muchas veces te dá la clave.

Hace ya años que desterré word y excel de mis pc, incluidos los del trabajo, así que en esta ocasión no te puedo ayudar mucho más!


Ya me has ayudado muchísimo amigo !!! Grandes abrazos !!!
  • 0




IP.Board spam blocked by CleanTalk.