 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Kosky Ens


Registrado: 17 Jun 2003Mensajes: 40Ubicación: Sant Joan de les Abadesses
|
Publicado: Mie 25 Jun, 2003 9:03 am Asunto: Sustituir texto en un documento de Word usando automatizacio |
|
|
En el Tips & Tricks hay un codigo de sustituir texto en un documento Word, creado por Leo, mi problema és que si en el documento word tengo una tabla, no me busca dentro del contenido de la tabla, como lo puedo solucionar ?
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 25 Jun, 2003 2:43 pm Asunto: |
|
|
Hola Kosky:
A mi ese código me substituye correctamente el texto contenido en las tablas.
Lo que no substituye es por ejemplo el texto creado como "cuadros de texto" (menú insertar) o cabeceras y pies de pagina, etc... Pero el ejemplo pretendía ser sencillo.
Puedo modificar el código para que cambie otras partes, pero te agradecería me pasases un documento creado de ejemplo con cosas que la actual rutina no te substituye correctamente para poder hacer mejor las pruebas. Puedes enviarlo a:
info ARROBA leosoftware PUNTO com
Saludos:
_Leo |
|
| Volver arriba |
|
 |
Kosky Ens


Registrado: 17 Jun 2003Mensajes: 40Ubicación: Sant Joan de les Abadesses
|
Publicado: Mie 25 Jun, 2003 4:03 pm Asunto: El problema esta en el cuadro de texto |
|
|
He modificado el word que me da problemas, y he observado que el problema no esta en la tabla sino en el cuadro de texto, el caso es que tengo dentro de un cuadro de texto una tabla.
Creo que el problema esta en el cuadro de texto, de todas maneras te he enviado el documento en question para que lo ojees.
Muchas Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 25 Jun, 2003 8:01 pm Asunto: |
|
|
Aquí tienes la rutina modificada para que también substituya todo lo que metas dentro de cuadros de texto:
(El inconveniente es que si hay cuadros de texto la substitución es más lenta)
| Código: | Variant vWord, vDocumentos, vDocumento, vStoryRanges, vBuscar, vRango;
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
);
const int maxStory = 2;
int story[maxStory] = { 1 /*wdMainTextStory*/,
5 /*wdTextFrameStory*/ };
for (int i=0; i<maxStory; ++i)
{
vStoryRanges = vDocumento.OlePropertyGet("StoryRanges");
try
{
vRango = vStoryRanges.OleFunction("Item", story[i]);
}
catch (EOleSysError& e)
{
continue;
}
do
{
vBuscar = vRango.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 << Edit1->Text.c_str() << 2);
vRango = vRango.OlePropertyGet("NextStoryRange");
} while(static_cast<IDispatch*>(vRango));
} // for i
//--- 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 = vStoryRanges = vBuscar = vRango = Unassigned; |
|
|
| Volver arriba |
|
 |
Kosky Ens


Registrado: 17 Jun 2003Mensajes: 40Ubicación: Sant Joan de les Abadesses
|
Publicado: Sab 28 Jun, 2003 4:13 pm Asunto: Funciona correctamente la nueva funcion |
|
|
Gracias Leo,
La nueva funcion funciona correctamente y si es cierto que el trabajar con cuadros de texto ralentiza mucho la busqueda.
Tengo una idea y me gustaria que me comenteis si la encontrais viable o no, el caso es que estoy desenvolupando un programa que me realiza unos calculos y me genera los informes correspondientes ( en word ), la cantidad de informes puede variar pero es superior a 30 documentos por informe, la idea es poder crear un processo que cree un indice ( a partir del directorio y del nombre del documento ) y un informe ( con todos los documentos generados por la aplicacion )
Possible creo que es, pero no se si el coste de tiempo del processo merce la pena, trabajo con documentos con imagenes y eso ralentiza mucho.
Gracias, y especialmente a ti Leo por la funcion de busqueda dentro de los cuadros de texto
Kosky |
|
| 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.
|