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 automatizació

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

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
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

Por si alguien quiere probarlo puede bajarse un proyecto de ejemplo en BCB1 o BCB6
Volver arriba
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

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
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

HOLA

LEO A MI ME DA UN ERROR DE TAutoArgs

GRACIAS

Volver arriba
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

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
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

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 Sad

Gracias

Ricardo

Volver arriba
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

leo muchas gracias lo probare y perdona por a verlo preguntado tantas veces

gracias

Volver arriba
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

leo muchas gracias lo probare y perdona por a verlo preguntado tantas veces

gracias

Volver arriba
Mensaje    Asunto: Sustituir texto en un documento de Word usando automatizació Responder citando

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
Mensaje    Asunto: me sale un error Responder citando

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 Sad....

·Error inesperado·
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Actualización del código Responder citando

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
Ver perfil de usuario Enviar mensaje privado 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.