0

我使用 Word 文档作为模板,如下所示:

Hello my name is {MERGEFIELD Name /*MERGEFORMAT}
{IF {MERGEFIELD Gender /*MERGEFORMAT} = "M" 
"Your gender is {MERGEFIELD Gender /*MERGEFORMAT}" ""}

我的 C# 程序如下所示:

Microsoft.Office.Interop.Word.Document documentWord = application.Documents.Open(myWordTemplate);
//Gender and Name are dynamic fields for the example
var myDynamicFields = dbContext.MyFields.All();
foreach (Microsoft.Office.Interop.Word.Field field in documentWord.Fields)
{
    foreach (var item in myDynamicFields)
    {
          //Search for a "Name" or "Gender" field
          if (field.Code.Text.Contains(item.Key))
          {
               field.Select();
               text = item.Value + " ";
               application.Selection.TypeText(text);

               break;
          }
     }       
}

所以,我的问题是我的代码只检测到 2 个 Mergefield:Name MergeField 和字段 if。我想替换该字段中的 Mergefield Gender if。我怎样才能做到这一点?

4

1 回答 1

2

您的代码不起作用的原因是该字段的字段代码If还包含合并字段。所以 Select 和 TypeText 正在摆脱该If字段,它的MergeField,因此Mergefield在循环重复时找不到。

更好的是检查Field.Type属性。我还冒昧地对您的代码进行了一些优化,这样您就不需要实际显示域代码。

使用Range对象,您可以将范围设置TextRetrievalMode为包含域代码,这样就不需要显示它们。我的代码示例将该字段的范围设置为另一个Range对象,删除该字段,然后写入该范围。

(由于我无权访问您的数据库信息,因此需要调整下面的代码,但我相信这对您来说没问题。我已将您的代码以及您的评论留在评论中,以便您可以自己定位。)

Word.Range rngDocBody = doc.Content;
Word.Range rngField = null;
rngDocBody.TextRetrievalMode.IncludeFieldCodes = true;
foreach (Word.Field field in rngDocBody.Fields)
{
        //Search for a "Name" or "Gender" field
        if (field.Type == Word.WdFieldType.wdFieldMergeField)
        {
            rngField = field.Result;
            //field.Select();
            //doc.Application.Selection.TypeText("X");
            field.Delete();
            rngField.Text = "X";
           // break;
        }
}
于 2016-05-09T17:05:50.360 回答