使用C#填充Word模板字段

4

目前,如果我使用C#创建带有字段的Word文档模板,然后填充它们,我会采用以下方式...

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"

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

我注意到在创建模板时,我可以为字段添加标题和标签,但是我没有找到引用这些属性的方法。能够命名字段并直接引用它们会很不错,而不仅仅是计数并弄清楚自己所在的字段。

3个回答

6

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

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;

1
这个方法需要在运行此代码的服务器上安装 Microsoft Word 吗? - Ben

4

您是否正在使用旧版表单?当您将旧版表单字段添加到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"

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


嘿,好的。你最后提到的那个方法对我很有用。我想我一直在查找字段,不知道还有ContentControls这个东西。谢谢。 - erosebe
没问题!你已经给了我足够的声望来投票赞成评论,所以谢谢你。 - perry
嘿,只是为了记录,你的示例代码有一个类型错误。(1) 应该是 [1]。而且它确实是基于 1 的,而不是基于 0 的,这有点奇怪。 - erosebe
我更新了答案以澄清,这是VB和C#之间非常微小的差异之一。VB很可爱 :) - perry

0

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

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";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接