 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
_Leo Invitado
|
Publicado: Mie 26 Jun, 2002 11:03 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
Esta función permite sustituir texto dentro de un documento de Word. La ventaja es que usamos enlace tardío, con lo que no tenemos que complicarnos instalando componentes ni librerías.
Seria útil por ejemplo para crear reportes sencillos usando Word. Por ejemplo, podemos sustituir "{{nombre}}" por "Pepito de los palotes". Además se mantiene el formato que le hayamos dado al texto que vamos a sustituir.
Lo primero es añadir el siguiente código al comienzo de nuestro modulo:
| Código: | #if (__BORLANDC__ >= 0x0530)
#include <Comobj.hpp>
#else
#include <oleauto.hpp> // BCB 1
#endif |
y a continuación para probarlo añadimos un TButton y dentro de su evento OnClick metemos el siguiente código
| Código: | Variant vWord, vDocumentos, vDocumento, vSeleccion, vBuscar;
String sPath = ExtractFilePath( Application->ExeName );
String sFicheroPlantilla = sPath + "plantilla.doc";
String sFicheroGenerado = sPath + "plantilla2.doc";
//--- Abre Word
vWord = CreateOleObject( "Word.Application" );
vWord.OlePropertySet( "Visible", !checkGuardar->Checked );
//--- Abre el documento que usaremos como plantilla
vDocumentos = vWord.OlePropertyGet( "Documents" );
vDocumento = vDocumentos.OleFunction( "Open",
sFicheroPlantilla.c_str(), // Documento
false, // Confirmar conversiones
true, // Modo se solo lectura
false, // Añadir al menu de ficheros recientes
"" // Clave del documento
);
//--- Selecciona todo el documento para reemplazar
vSeleccion = vWord.OlePropertyGet( "Selection" );
vSeleccion.OlePropertyGet( "Range" ).OleProcedure( "SetRange", 0, 0 );
vBuscar = vSeleccion.OlePropertyGet( "Find" );
vBuscar.OleProcedure( "ClearFormatting" );
vBuscar.OlePropertyGet( "Replacement" ).OleProcedure( "ClearFormatting" );
//--- sustituimos una palabra
// Aqui podemos meter el bucle que va a ir reemplanzando palabras
vBuscar.Exec( Procedure( "Execute" )
<< "{{nombre}}" // Texto a buscar
<< VT_EMPTY // Coincidir mayusculas y minusculas
<< VT_EMPTY // Solo palabras completas
<< VT_EMPTY // Usar caracteres comodin
<< VT_EMPTY // Suena como
<< VT_EMPTY // Todas las formas de la palabra
<< true // Hacia adelante
<< VT_EMPTY // Wrap
<< VT_EMPTY // Format
<< Edit1->Text.c_str() // Reemplazar con...
<< 2 // 2 = reemplazar todo
);
//--- sustituimos otra palabra
vBuscar.Exec( Procedure( "Execute" ) << "{{direccion}}"
<< VT_EMPTY << VT_EMPTY << VT_EMPTY << VT_EMPTY << VT_EMPTY
<< true << VT_EMPTY << VT_EMPTY << Edit2->Text.c_str() << 2 );
//--- salvamos automaticamente si procede y cerramos Word
if ( checkGuardar->Checked )
{
vDocumento.OleProcedure( "SaveAs", sFicheroGenerado.c_str() );
vDocumento.OleProcedure( "Close", 0xFFFFFFFF);
vWord.OleProcedure( "Quit" );
ShowMessage("Documento generado.");
}
vWord = vDocumentos = vDocumento = vSeleccion = vBuscar = Unassigned; |
Vale para cualquier versión de C++Builder. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mie 26 Jun, 2002 11:11 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| Por si alguien quiere probarlo puede bajarse un proyecto de ejemplo en BCB1 o BCB6 |
|
| Volver arriba |
|
 |
Ricardo Invitado
|
Publicado: Jue 27 Jun, 2002 9:59 am Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| Hola Leo, tenía una dudilla sobre esto que haces, y que pienso puede ser interesante para los 2. Yo estoy haciendo algo parecido, pero intento seleccionar la palabra a sustituir en el word (p.ej "direccion") como un bookmark, con lo cual me ahorro la rútina de busqueda en el texto, ya el word se desplaza directamente hasta este punto y hacer la sustitución, es tal como la haces tú. El problema que tengo es que cuando uso los bookmarks, no me encuentra ninguno en el documento. Este es el código que yo utilizo: OleVariant What, Which, Count, Name ;
What = wdGoToBookmark; Which =EmptyParam; Count = EmptyParam; Name= "direccion"; //nombre del bookmark en el documento de word. En castellano sería Insertar/marcador WordApplication1->Selection->GoTo(What, Which, Count, Name); //desplaza el cursor y selecciona el marcador
WordApplication1->Selection->TypeText(Edit1->Text); //sustituye el texto
Pero el problema es que siempre me hace la inserción al principio del documento, pq no encuentra el bookmark. Alguna idea??? Gracias. Ricardo |
|
| Volver arriba |
|
 |
tony Invitado
|
Publicado: Jue 27 Jun, 2002 1:05 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| HOLA LEO A MI ME DA UN ERROR DE TAutoArgs GRACIAS |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 27 Jun, 2002 1:45 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
Tony, prueba a añadir '#include <utilcls.h>' que es donde esta declarado 'TAutoArgs', aunque a mi me funciona sin ponerlo, tanto en el BCB1 como en el BCB6.Ricardo, aquí tienes el ejemplo modificado para que funcione con "marcas/marcadores":
| Código: | Variant vWord, vDocumentos, vDocumento, vSeleccion;
String sPath = ExtractFilePath( Application->ExeName );
String sFicheroPlantilla = sPath + "plantilla.doc";
String sFicheroGenerado = sPath + "plantilla2.doc";
//--- Abre Word
vWord = CreateOleObject( "Word.Application" );
vWord.OlePropertySet( "Visible", !checkGuardar->Checked );
//--- Abre el documento que usaremos como plantilla
vDocumentos = vWord.OlePropertyGet( "Documents" );
vDocumento = vDocumentos.OleFunction( "Open",
sFicheroPlantilla.c_str(), // Documento
false, // Confirmar conversiones
true, // Modo se solo lectura
false, // Añadir al menu de ficheros recientes
"" // Clave del documento
);
vSeleccion = vWord.OlePropertyGet( "Selection" );
//////////////////////////////////////////////////////////////////////
// MODIFICADO PARA INSERTAR EL TEXTO BUSCANDO MARCAS
//////////////////////////////////////////////////////////////////////
//--- sustituimos una marca
// Aqui podemos meter el bucle que va a ir reemplanzando palabras
vSeleccion.OleProcedure( "Goto",
-1, // Tipo de salto (-1 = wdGoToBookmark)
VT_EMPTY, // A donde saltamos ?
VT_EMPTY, // Posicion
"nombre" // Etiqueta/marca/campo...
);
// Una vez encontrada la marca insertamos el texto
vSeleccion.OleProcedure( "TypeText", Edit1->Text.c_str() );
//--- sustituimos otra marca
vSeleccion.OleProcedure( "Goto", -1, VT_EMPTY, VT_EMPTY, "direccion" );
vSeleccion.OleProcedure( "TypeText", Edit2->Text.c_str() );
//////////////////////////////////////////////////////////////////////
//--- salvamos automaticamente si procede y cerramos Word
if ( checkGuardar->Checked )
{
vDocumento.OleProcedure( "SaveAs", sFicheroGenerado.c_str() );
vDocumento.OleProcedure( "Close", -1);
vWord.OleProcedure( "Quit" );
ShowMessage("Documento generado.");
}
vWord = vDocumentos = vDocumento = vSeleccion = Unassigned; |
también como en el anterior puedes bajar el ejemplo compilado y con los fuentes incluidos, tanto para el BCB1 como para el BCB6 |
|
| Volver arriba |
|
 |
Ricardo Invitado
|
Publicado: Jue 27 Jun, 2002 1:55 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| Vale Leo, muchas gracias, eres un monstruo. Esta tarde lo pruebo, y espero hacerlo funcionar ya de una vez, porque llevo tantas cosillas probadas... Lo peor, ya por reto personal, es no saber que es lo que estaba haciendo mal  Gracias Ricardo |
|
| Volver arriba |
|
 |
tony Invitado
|
Publicado: Jue 27 Jun, 2002 2:37 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| leo muchas gracias lo probare y perdona por a verlo preguntado tantas veces gracias |
|
| Volver arriba |
|
 |
tony Invitado
|
Publicado: Jue 27 Jun, 2002 3:04 pm Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| leo muchas gracias lo probare y perdona por a verlo preguntado tantas veces gracias |
|
| Volver arriba |
|
 |
Ricardo Invitado
|
Publicado: Vie 19 Jul, 2002 12:12 am Asunto: Sustituir texto en un documento de Word usando automatizació |
|
|
| Oye Leo, una nueva duda al respecto, consigo poner la visualización preliminar y cerrar el documento sin guardarlo, pero la cosa es como puedo "parar" la ejecución del programa hasta que o mande a imprimir el documento, o haga modificaciones? supongo que será algo así como while "no cerrado documento de word" {wait } pero no me parece muy eficiente, hay alguna manera mejor de esperar la respuesta del word?? Gracias!!!
|
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Mar 08 Feb, 2005 10:34 pm Asunto: me sale un error |
|
|
| Código: |
vSeleccion.OleProcedure( "Goto",
-1, // Tipo de salto (-1 = wdGoToBookmark)
VT_EMPTY, // A donde saltamos ?
VT_EMPTY, // Posicion
"nombre" // Etiqueta/marca/campo...
);
|
me sale un error al respecto, no muy especifico pero no me puede ir hacia la palabra.... me funciona muy bien con el asunto del texto, pero queria ocupar esto para poder pegar luego algo que está en el portapapeles, pero no me pasa esa linea de tu codigo....
antes de este codigo, me posiciono en una excel , y copio un rango en el portapapeles, luego quice ocupar tu codigo para posicionarme en mi word y pegar... pero no entiendo el error ....
·Error inesperado· |
|
| Volver arriba |
|
 |
Kurroman Lt

Registrado: 07 Dic 2003Mensajes: 79
|
Publicado: Mie 01 Jun, 2005 12:45 pm Asunto: |
|
|
| Pues me funciona bien el tema de los marcadores, pero al final de lo que sustituye me sale una especie de cuadradito, esto sabeis porque pasa? |
|
| Volver arriba |
|
 |
SumSum Lt JG


Registrado: 06 Oct 2002Mensajes: 52
|
Publicado: Vie 15 Nov, 2019 6:23 pm Asunto: Actualización del código |
|
|
Con las nuevas versiones de C++Builder el código que funcionaba en BCB6 ya no funciona porque se hace necesario cambiar a WideString.
Leo ha adaptado el código y funciona en cualquier versión de C++Builder
Aquí os lo pego... (Gracias Leo)
//Añadimos: #include <ComObj>
WideString sPath = ExtractFilePath(Application->ExeName);
WideString sFicheroPlantilla = sPath + "plantilla.docx";
WideString sFicheroGenerado = sPath + "plantilla2.docx";
Variant vWord, vDocumentos, vDocumento, vContenido, vBuscar;
const int wdFindContinue = 1, wdReplaceOne = 1, wdReplaceAll = 2;
//--- Abre Word
vWord = CreateOleObject("Word.Application");
vWord.OlePropertySet("Visible", !checkGuardar->Checked);
//--- Abre el documento que usaremos como plantilla
vDocumentos = vWord.OlePropertyGet("Documents");
vDocumento = vDocumentos.OleFunction("Open",
sFicheroPlantilla, // Documento
false, // Confirmar conversiones
true, // Modo de solo lectura
false, // Añadir al menu de ficheros recientes
WideString("") // Clave del documento
);
//--- Selecciona todo el documento para reemplazar
vContenido = vDocumento.OlePropertyGet("Content");
vBuscar = vContenido.OlePropertyGet("Find");
vBuscar.OleProcedure("ClearFormatting");
//--- sustituimos una palabra
// Aqui podemos meter el bucle que va a ir reemplanzando palabras
vBuscar.OleProcedure("Execute",
WideString("{{nombre}}"), // Texto a buscar
false, // Coincidir mayusculas y minusculas
false, // Solo palabras completas
false, // Usar caracteres comodin
false, // Suena como
false, // Todas las formas de la palabra
true, // Hacia adelante
wdFindContinue, // Wrap
false, // Format
WideString(Edit1->Text), // Reemplazar con...
wdReplaceAll // wdReplaceAll / wdReplaceOne
);
//--- sustituimos otra palabra
vBuscar.OleProcedure("Execute", WideString("{{direccion}}"),
false, false, false, false, false, true, wdFindContinue,
false, WideString(Edit2->Text), wdReplaceAll);
//--- salvamos automaticamente si procede y cerramos Word
if (checkGuardar->Checked)
{
vDocumento.OleProcedure("SaveAs", sFicheroGenerado);
vDocumento.OleProcedure("Close", 0xFFFFFFFF);
vWord.OleProcedure("Quit");
ShowMessage("Documento generado.");
}
vWord = vDocumentos = vDocumento = vContenido = vBuscar = Unassigned(); _________________ Asun |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|