Search code examples
c#ms-wordoffice-interopword-templateword-field

Filling Word template fields with C#


Currently, if I create a Word Document Template with fields, and then fill them using C#, I do it similar to this...

object missing = Type.Missing;
Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open("file.doc", ref missing, true);
Word.FormFields fields = doc.FormFields;
fields[2].Result = "foo"
fields[3].Result = "bar"

Is there a better way to reference the fields?

I notice when creating the template I can add a Title and a Tag to the field, but I haven't found a way to reference those properties. It would be nice to be able to name fields and reference them directly, instead of just counting and figuring out which field I am on.


Solution

  • Are you using legacy forms? When you add a legacy form field to a Word doc, under Properties > Field Settings there is a Bookmark which is basically the name of the field. By default, a legacy text field will have a Bookmark of "Text1", "Text2", etc.

    So in VBA:

    ActiveDocument.FormFields("Text1").Result = "asdf"
    

    In your case it might be (C#):

    doc.FormFields["Text1"].Result = "asdf"
    

    Or you could simply write a loop that scans the list of fields and looks for a given name (pseudo-VB):

    Function GetFieldByName(name As String) As Field
        Dim i
        For i = 0 to fields.count - 1
            If fields(i).Name = name Then Return fields(i)
        Next
        Return Nothing
    End Function
    

    If you're using the newer form field controls where you can set a Tag and automate with VSTO (C#):

    doc.SelectContentControlsByTag("Address")[1].Range.Text = "asdf"
    

    Read more about Content Controls here.