PDA

Ver la Versión Completa : Combinar Correspondencia con Word


VRO
23-09-2004, 11:20:07
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
...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...


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.aspx?scid=kb;EN-US;220607
http://support.microsoft.com/default.aspx?scid=kb;EN-US;220911
http://www.kayodeok.btinternet.co.uk/favorites/kbofficeword.htm#kbmailmerge

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
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
...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 (http://www.djpate.freeserve.co.uk/AutoWord.htm#CloseWord)
Close a document (http://www.djpate.freeserve.co.uk/AutoWord.htm#FileClose)

walace_soy
18-10-2004, 13:17:17
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.