Hace bastante tiempo, en un programa utilizé la combinación de correspondencia de word y la verdad es que funcionaba bastante bien.
Lo que hacía era lo siguiente:
(1) Creaba un fichero de texto (Base de Datos en formato TEXTO) desde el programa con datos de ejemplo; Un único registro con todos los campos de la exportación.
Combi.txt
(2) Con este fichero (el Cliente o yo) se prepara el documento de "Combinar correspondencia desde Word"; Se añadían los campos desde Word y servía para diseñar la plantilla.
(3) Luego a la hora de generar los documentos, en el mismo lugar y con el mismo nombre se generaba el fichero con datos reales para realizar el MailMerge.
He buscado el código que hacía el MailMerge; Te lo pongo aquí a ver si te sirve; Está bastante comentado y es bastante sencillo de entender. Está en Delphi 5, que es lo que usaba entonces.
Código Delphi
[-]
procedure TFLaunchWord._LaunchImpresion;
var
JobsIniciales:Integer;
TP, CP:Integer;
begin
try
if( VarIsEmpty( WinWord ) ) then begin
WinWord := CreateOleObject('Word.Basic');
end
else begin
WinWord.AppClose('');
Self._ForceCloseWinword();
WinWord := CreateOleObject('Word.Basic');
end;
except
MessageDlg('Error en la creación de objeto OLE Revise la configuración', mtError, [mbOK], 0);
Exit;
end;
try
try
if VarType(WinWord) <> VarDispatch Then begin
ShowMessage('Error al iniciar MS-Word')
end
Else Begin
WinWord.FileOpen(Self._FFileName);
try
WinWord.MailMergeToDoc;
except on E:EOLEException do begin
end;
end;
JobsIniciales := _EnumJobs;
WinWord.FilePrint(,,,,,,,Self._FCopias);
sleep(500);
while (_EnumJobs <> JobsIniciales) do begin
Self._GetPagesLastJob(TP, CP);
Self.LabelProceso.Caption := Format('Enviando página %d',[TP]);
Self.LabelProceso.Repaint;
Self.LabelProceso.Refresh;
Application.ProcessMessages;
sleep(500);
end;
sleep(3000);
Self.LabelProceso.Caption := 'Completado';
Self.LabelProceso.Repaint;
Self.LabelProceso.Refresh;
WinWord.FileCloseAll(2);
End;
except
MessageDlg('Error en el enlace con Word'#13#13 +
'Revise la configuración'#13#13 + 'Fichero: ' + Self._FFileName, mtError, [mbOK], 0);
end;
finally
WinWord.AppClose('');
WinWord := UnAssigned;
Self.Close;
End;
end;