【问题标题】:Filling Word template fields with C#使用 C# 填充 Word 模板字段
【发布时间】:2014-10-16 16:06:47
【问题描述】:

目前,如果我创建一个带有字段的 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# ms-word office-interop word-template word-field


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

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

      阅读更多关于内容控制的信息here

      【讨论】:

      • 嘿,好吧。你提到的最后一件事对我有用。我想我被困在字段中并且不知道 ContentControls。谢谢。
      • 没问题!你现在给了我足够的代表来投票给 cmets,所以谢谢你。
      • 嘿,只是为了记录,你的示例代码有一个类型。 (1) 应该是 [1]。它确实是基于 1,而不是 0,这有点奇怪。
      • 我更新了答案以澄清,这是 VB 和 C# 之间非常小的区别之一。 VB很可爱:)
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2012-03-27
        相关资源
        最近更新 更多