Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Combinar Correspondencia con Word (https://www.clubdelphi.com/foros/showthread.php?t=14531)

VRO 23-09-2004 11:20:07

Combinar Correspondencia con Word
 
Hola, estoy intentando combinar correspondencia en word y por lo que he visto en el foro se hace con el MailMerge, le estoy empezando a utilizar y no se muy bien como hacerlo.

¿Si alguien me podría guiar ?, estoy bastante confusa y no se por donde empezar.

Muchas Gracias.

Neftali [Germán.Estévez] 23-09-2004 11:41:44

Cita:

Empezado por VRO
...estoy intentando combinar correspondencia en word y por lo que he visto en el foro se hace con el MailMerge, le estoy empezando a utilizar y no se muy bien como hacerlo.

Puedes echarle un vistazo a ésta función; He de decir que no la he probado, así que no se si funcionará (ya me dirás...); Como mínimo te puede servir de guía para saber cómo va...

Código Delphi [-]
procedure DoMSWordMerge(template_file, data_file: String; see_Word,
                        auto_print: Boolean);

{Arguments: template_file: path and name of existing MS Word template merge file
            data_file:     existing merge data file (must have a file extension 
                           recognized by MS Word)
            see_Word:      set to True if you want user to be able to see Word
            auto_print:    set to True if you want result document to print 
                           automatically and Word to exit

As written this code requires that the Word2000.PAS file be referenced in the 
Uses section. To compile with the Word97.PAS file simply change the OpenOld 
method call to "Open" and the PrintOutOld call to "PrintOut".  Also requires 
ComObj and ActiveX in the Uses section.    }

var
  MSWord: _Application;
  MSDoc: _Document;
  Unknown: IUnknown;
  OLEResult: HResult;
  OLEvar: OleVariant;
begin
  OLEResult := GetActiveObject(CLASS_WordApplication, nil, Unknown);
  if (OLEResult = MK_E_UNAVAILABLE) then
    MSWord := CoWordApplication.Create          //get MS Word running
  else begin
    OleCheck(OLEResult);                           //check for errors
    OleCheck(Unknown.QueryInterface(_Application, MSWord));
  end;
  MSWord.Visible := see_Word;                   //let user see Word running
  OLEvar := template_file;                      //merge template document
  MSDoc := MSWord.Documents.OpenOld(OLEvar, EmptyParam, EmptyParam, EmptyParam, 
           EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
           EmptyParam);
  MSDoc.MAILMERGE.OpenDataSource(data_file, EmptyParam, EmptyParam, EmptyParam, 
           EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 
           EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

  OLEvar := False;
  with MSDoc.MAILMERGE do begin
    Destination := wdSendToNewDocument;
    Datasource.FirstRecord := wdDefaultFirstRecord;
    Datasource.LastRecord := Integer(wdDefaultLastRecord);
    Execute(OLEvar);                       //do merge into new document
  end;

  MSDoc.Close(EmptyParam, EmptyParam, EmptyParam);  //close template document
  OLEvar := 1;
  MSDoc := MSWord.Documents.item(OLEvar);  //attach to the merge result document

  {The next 4 lines cause Word to print the merged document and then exit. If 
   removed, Word will remain active without printing the merge document and
   control will return to the Delphi program. User will have to print the
   document by hand themselves.}
  if auto_print then begin
    OLEvar := False;                    //implies wait for printing to complete
    MSDoc.PrintOutOld(OLEvar, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                EmptyParam, EmptyParam, EmptyParam, EmptyParam);
    OLEvar := wdDoNotSaveChanges;           //don't save the merge document
    MSWord.Quit(OLEvar, EmptyParam, EmptyParam);
  end;

  MSDoc := nil;
  MSWord := nil;
end;

Otra opción que a veces utilizo yo cuando tengo que hacer automatizaciones con Word/excel, es crear un macro que realice un determinado trabajo y luego echarle un vistazo al código. El VBA es bastante compresible y te puede dar una idea de por dónde tirar....

Aparte puedes mirar éstos links:
http://support.microsoft.com/default...b;EN-US;220607
http://support.microsoft.com/default...b;EN-US;220911
http://<a href="http://www.kayodeok....bmailmerge</a>

VRO 23-09-2004 12:09:04

Gracias por tu ayuda te prometo que estoy mirando el código que me diste.

Gracias

VRO 23-09-2004 16:48:04

Hola Neftali probé tu método y me da un error nada más ejecutar, no me reconoce el procedimiento y tampoco reconoce el GetActiveObject,

¿será porque me falta instalar ó declarar al componente u objeto?

Neftali [Germán.Estévez] 27-09-2004 09:34:43

Supongo que me dejé de decirte que debes añadir al uses las siguientes librerías:
ActiveX, ComObj, Word_TLB :(

Word_TLB, si no la tiees en el directorio "Imports" de delphi deberás importarla desde el menú: Project/Import Type Librery/ Microsoft Word Application

VRO 28-09-2004 17:06:46

Conseguido
 
Hola Neftalí ya conseguí hacer la combinación de correspondencia con una macro, de tu forma no la he vuelto a probar ya que tengo que consegui la libreria Word_tlb, pero prometo hacerlo.

Si alguien tiene alguna duda de como hacer la combinación de correspondencia le puedo dejar el código de la macro.

Una preguntilla una vez hecha la combinación de correspondencia y habiendo obtenido los resultados ¿alguien sabe como cerrarla ventana de word donde haces la correspondencia, no la de los resultados jo se si me explico, para que no la vea el usuario?

Muchas gracias, que sería de los que no tenemos experiencia sin el Club Delphi.

Neftali [Germán.Estévez] 29-09-2004 09:48:31

Cita:

Empezado por VRO
...Una preguntilla una vez hecha la combinación de correspondencia y habiendo obtenido los resultados ¿alguien sabe como cerrarla ventana de word donde haces la correspondencia, no la de los resultados jo se si me explico, para que no la vea el usuario?

A ver si uno de éstos dos links te sirve:

Close Word
Close a document

walace_soy 18-10-2004 13:17:17

combinación de correspondencia
 
Si quereis hacer combinación de correspondencia os aconsejo que busqueis una unidad llamada MailMerge, que esta en internet y te hace todo y con unas pequeñas modificaciones podeis hacerla funcionar con cualquier word (desde office 97 hasta office 2003).

La función que se ha añadido es la ultima parte del proceso y creo que no esta del todo bien, pero no he podido darle un vistazo y probarla. Antes de eso hay que hacer procedimientos o funciones como quieras decirlo para incorporar los campos en el documento, porque sino tienes las etiquetas, el Execute... no te va a funcionar mucho.

Si no tienes suficiente información con lo que te han dicho, y no encuentras la unidad MailMerge, dimelo porque te la paso y viendola un poco aprenderas a utilizarla rapidamente. Pero que conste que utilizando el objeto TWordApplication puedes hacer lo mismo, solo hay que saber todos los comandos y procesos que hay que utilizar.

Ciao.


La franja horaria es GMT +2. Ahora son las 08:53:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi