4

目前,如果我创建一个带有字段的 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"

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

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

4

3 回答 3

5

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

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;
于 2014-10-16T16:19:03.453 回答
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"

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

于 2014-10-16T16:40:34.267 回答
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";
于 2020-06-08T16:06:01.803 回答