Envoi de texte à des champs de fusion dans Microsoft Word 2010

J’utilise le code suivant pour envoyer un texte à un modèle de mot simple que j’ai configuré pour le moment avec un seul champ MergeField afin de tester que je peux obtenir que cela fonctionne.
Le code que j’utilise est le suivant:

public static void ReplaceMailMergeField(ssortingng pWordDoc, ssortingng pMergeField, ssortingng pValue) { object docName = pWordDoc; object missing = Missing.Value; Word.MailMerge mailMerge; Word._Document doc; Word.Application app = new Word.Application(); app.Visible = false; doc = app.Documents.Open(ref docName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); mailMerge = doc.MailMerge; foreach (Word.MailMergeField f in mailMerge.Fields) { if (f.Code.Text.IndexOf("MERGEFIELD \"" + pMergeField + "\"") > -1) { f.Select(); app.Selection.TypeText(pValue); } } object saveChanges = Word.WdSaveOptions.wdSaveChanges; doc.Close(ref saveChanges, ref missing, ref missing); app.Quit(ref missing, ref missing, ref missing); } 

Ce que j’appelle depuis mon application avec les éléments suivants:

 ssortingng pWordDoc = @"C:\Users\Pete-Laptop\Documents\CMS Document Mangement\Word Template.dotx"; cDocument.ReplaceMailMergeField(pWordDoc, "fieldAddress1", "Put address here!"); 

Mais rien ne se passe. Lorsque je fais défiler le code, il va aussi loin que app.Documents.Open et semble alors se figer. Je crois que c’est parce que l’application ne peut pas trouver mon document Word. Ai-je raison d’envoyer le chemin d’access complet au paramètre filename? Sinon, comment l’application va-t-elle trouver mon modèle Word?

Le code final que j’ai utilisé et qui fonctionne pour moi est le suivant:

 public static void TextToWord(ssortingng pWordDoc, ssortingng pMergeField, ssortingng pValue) { Object oMissing = System.Reflection.Missing.Value; Object oTrue = true; Object oFalse = false; Word.Application oWord = new Word.Application(); Word.Document oWordDoc = new Word.Document(); oWord.Visible = true; Object oTemplatePath = pWordDoc; oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); foreach (Word.Field myMergeField in oWordDoc.Fields) { Word.Range rngFieldCode = myMergeField.Code; Ssortingng fieldText = rngFieldCode.Text; if (fieldText.StartsWith(" MERGEFIELD")) { Int32 endMerge = fieldText.IndexOf("\\"); Int32 fieldNameLength = fieldText.Length - endMerge; Ssortingng fieldName = fieldText.Subssortingng(11, endMerge - 11); fieldName = fieldName.Trim(); if (fieldName == pMergeField) { myMergeField.Select(); oWord.Selection.TypeText(pValue); } } } } 

Ce code est originellement d’ ici .

Vous pouvez essayer avec:

 _doc = _app.Documents.Add(ref _docName , ref _missing , ref _missing , ref _missing ); 

au lieu de

 _doc = _app.Documents.Open(.......); 

puis vérifiez si cette ligne est correcte:

 if (f.Code.Text.IndexOf("MERGEFIELD \"" + pMergeField + "\"") > -1) 

J’ai un code qui fonctionne de cette façon

  mailMerge = doc.MailMerge; foreach (Word.MailMergeField f in mailMerge.Fields) { // Extract the name of the MergeField starting from the 11 character // and looking for the first space after the name // (this means that you avoid MergeFields names with embedded spaces) ssortingng fieldName = f.Code.Text.Subssortingng(11).Trim(); int pos = fieldName.IndexOf(' '); if (pos >= 0) fieldName = fieldName.Subssortingng(0, pos).Trim(); if (fieldName == pMergeField) { f.Select(); app.Selection.TypeText(pValue); }