用C#填充Word模板字段

本文关键字:字段 Word 填充 | 更新日期: 2023-09-27 18:26:43

目前,如果我创建一个带有字段的Word文档模板,然后使用C#填充它们,我会执行类似的操作。。。

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"

有更好的方法引用字段吗?

我注意到在创建模板时,我可以在字段中添加一个标题和一个标记,但我还没有找到引用这些属性的方法。如果能够命名字段并直接引用它们,而不仅仅是计数和计算我在哪个字段上,那就太好了。

用C#填充Word模板字段

一个很好的方法是,在模板中稍后要添加文本的每个位置放置一个书签(插入->链接->书签)。要从代码中使用它们,您需要按名称访问每个书签,请参见以下示例:

Word._Application wApp = new Word.Application();
Word.Documents wDocs = wApp.Documents;
Word._Document wDoc = wDocs.Open(ref "file_path_here", ReadOnly:false);
wDoc.Activate();
Word.Bookmarks wBookmarks = wDoc.Bookmarks;
Word.Bookmark wBookmark = wBookmarks["Bookmark_name"];
Word.Range wRange = wBookmark.Range;
wRange.Text = valueToSetInTemplate;

您是否使用遗留表单?当您将旧表单字段添加到Word文档中时,在"属性">"字段设置"下会有一个书签,它基本上是字段的名称。默认情况下,传统文本字段的书签为"Text1"、"Text2"等。

因此在VBA中:

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

在你的情况下,它可能是(C#):

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

或者,您可以简单地编写一个循环,扫描字段列表并查找给定的名称(伪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

如果您使用的是较新的表单字段控件,您可以在其中设置标记并使用VSTO(C#)进行自动化:

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

在此处阅读有关内容控件的更多信息。

对于我的特定文档,我们必须以不同的方式处理它,因为元素是变量。

object missing = Type.Missing;
Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open(@"C:''test1.dot", ref missing, true);
doc.Activate(); 
doc.Variables["CASE PLAN_PLAN_STATUS"].Value = "asdf1";