С# - заменить поле слияния внутри IfField

Я использую документ Word в качестве шаблона следующим образом:

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

Моя программа на С# выглядит так:

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: имя MergeField и поле if. Я хотел бы заменить Mergefield Gender в поле if. Как я могу это сделать?


person madhatterx    schedule 09.05.2016    source источник


Ответы (1)


Причина, по которой ваш код не работает, заключается в том, что код поля поля 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;
        }
}
person Cindy Meister    schedule 09.05.2016
comment
Спасибо за ваш ответ! У меня также возникла проблема с вводом поля слияния вручную (которое не распознается как MERGEFIELD), но я обнаружил, что мне нужно вставить его с помощью параметра QuickPart › Field › MergeField. - person madhatterx; 10.05.2016
comment
@madhatterx Вы можете вставить коды полей вручную, набрав Ctrl+F9, чтобы вставить поле { фигурные скобки }. Это специальные управляющие символы, которые выглядят как фигурные скобки, которые вы можете набирать :-) Так намного быстрее! - person Cindy Meister; 10.05.2016