问题描述
当前,如果我创建带有字段的Word文档模板,然后使用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.
推荐答案
您是否正在使用旧版表单?当您将旧版表单字段添加到Word文档时,在属性">字段设置"下会出现一个书签",它基本上就是该字段的名称.默认情况下,旧文本字段的书签将为"Text1","Text2"等.
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.
因此在VBA中:
ActiveDocument.FormFields("Text1").Result = "asdf"
在您的情况下,可能是(C#):
In your case it might be (C#):
doc.FormFields["Text1"].Result = "asdf"
或者您可以简单地编写一个循环,以扫描字段列表并查找给定名称(pseudo-VB):
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
如果您正在使用较新的表单字段控件,则可以在其中设置标签并使用VSTO(C#)自动进行操作:
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"
在此处了解更多信息.
这篇关于用C#填充Word模板字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!