Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Sustituir texto en un documento de Word usando automatizacio

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizacio Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: El problema esta en el cuadro de texto Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Funciona correctamente la nueva funcion Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.