2015-06-25 3 views
3

Я уже давно работаю над C# OpenXML SDK (Неофициальный пакет Microsoft 2.5 от NuGet), но недавно заметил, что следующая строка кода возвращает разные результаты в зависимости от того, какое настроение появляется в Microsoft Word, когда файл будет сохранен:При использовании полей полей MergeField в OpenXML SDK на C#, почему коды полей исчезают или фрагментируются?

var fields = document.Descendants<FieldCode>(); 

из того, что я могу сказать, при создании документа в первом месте (используя Слово 2013 на ОС Windows 8.1), если вы используете Вставка-> QuickParts-> Field и выберите MERGEFIELD из поля а затем укажите имя поля в свойствах поля и нажмите «ОК», тогда код поля будет правильно сохранен в документе, как и следовало ожидать.

Тогда, используя вышеупомянутую строку кода, я получу полевое поле для поля 1 поля. Если впоследствии я отредактирую этот документ (и даже оставлю это поле в одиночку), последующее сохранение может означать, что этот код поля больше не возвращается в моем запросе.

Другим случаем такой же любопытства является то, что я вижу, что узлы FieldCode разделены на несколько элементов. Таким образом, вместо того, чтобы видеть сказать:

" MERGEFIELD Author \\* MERGEFORMAT " 

В качестве имени узла, я буду видеть:

" MERGEFIELD Aut" 
"hor \\* MERGEFORMAT" 

Split как два значения FieldCode узла. Я понятия не имею, почему это так, но это, безусловно, делает мою способность сопоставлять узлы, которые намного более захватывают. Это ожидаемое поведение? Известная ошибка? Я действительно не хочу, чтобы взломать исходный XML-файл и отредактировать этот документ, пока я не пойму, что происходит. Большое спасибо.

+0

Я заметил, что мои «недостающие поля», похоже, были преобразованы в «SimpleField», и кто-нибудь понимает, почему это было бы? Или какая разница? –

ответ

1

Word часто разделяет текстовые пробеги на несколько текстовых прогонов без причины, которые я когда-либо понимал. При поиске, сравнении, упорядочении и т. Д. Мы обрабатываем тело методом, который объединяет несколько прогонов в один текстовый прогон.

/// <summary> 
    /// Combines the identical runs. 
    /// </summary> 
    /// <param name="body">The body.</param> 
    public static void CombineIdenticalRuns(W.Body body) 
    { 

     List<W.Run> runsToRemove = new List<W.Run>(); 

     foreach (W.Paragraph para in body.Descendants<W.Paragraph>()) 
     { 
      List<W.Run> runs = para.Elements<W.Run>().ToList(); 
      for (int i = runs.Count - 2; i >= 0; i--) 
      { 
       W.Text text1 = runs[i].GetFirstChild<W.Text>(); 
       W.Text text2 = runs[i + 1].GetFirstChild<W.Text>(); 
       if (text1 != null && text2 != null) 
       { 
        string rPr1 = ""; 
        string rPr2 = ""; 
        if (runs[i].RunProperties != null) rPr1 = runs[i].RunProperties.OuterXml; 
        if (runs[i + 1].RunProperties != null) rPr2 = runs[i + 1].RunProperties.OuterXml; 
        if (rPr1 == rPr2) 
        { 
         text1.Text += text2.Text; 
         runsToRemove.Add(runs[i + 1]); 
        } 
       } 
      } 
     } 
     foreach (W.Run run in runsToRemove) 
     { 
      run.Remove(); 
     } 
    } 
+0

Это верно и для полевых кодов? Я не против того, чтобы трассы были расщеплены, но тот факт, что код поля кажется поврежденным, - это то, что меня беспокоит. Я действительно не понимаю, как создается узел fieldcode, вы предполагаете, что сам код разбивается на прогоны? Я посмотрю ....! –

1

я наткнулся на эту самую проблему сам, и нашел решение, которое существует в OpenXML: утилита класса называется MarkupSimplifier, которая является частью PowerTools для Open XML проекта. С помощью этого класса были решены все проблемы, с которыми я сталкивался, которые вы описываете.

The full article is located here.

Вот некоторые уместные exercepts:

Пожалуй, наиболее полезным упрощением, что это выполняет является слияние соседних трасс с одинаковым форматированием.

Он продолжает говорить:

Открытые приложения XML, в том числе Word, можно произвольно расщепленных пробегов по мере необходимости. Если вы, например, добавили комментарий к документу, прогоны будут разделены по месту начала и конца комментария. После того, как MarkupSimplifier удаляет комментарии, он может объединять прогоны, что приводит к более простой разметке.

Пример класса полезности в использовании является:

SimplifyMarkupSettings settings = new SimplifyMarkupSettings 
{ 
    RemoveComments = true, 
    RemoveContentControls = true, 
    RemoveEndAndFootNotes = true, 
    RemoveFieldCodes = false, 
    RemoveLastRenderedPageBreak = true, 
    RemovePermissions = true, 
    RemoveProof = true, 
    RemoveRsidInfo = true, 
    RemoveSmartTags = true, 
    RemoveSoftHyphens = true, 
    ReplaceTabsWithSpaces = true, 
}; 
MarkupSimplifier.SimplifyMarkup(wordDoc, settings); 

Я много раз использовал с Word 2010 документов с использованием VS2015 .Net Framework 4.5.2 и это сделало мою жизнь намного Полегче.

Update:

Я вновь этот код и нашел, что это очищает от пробегов на MERGEFIELDS но не IF ПОЛЕЙ, которые ссылаются mergefields например

{if {MERGEFIELD When39} = "Y???" "Y" "N" } 

Я понятия не имею, почему это может быть так, и рассмотрение базового XML не предлагает никаких намеков.

+1

Очень интересно, я попробую и пойду на это и отчитаюсь –

+1

SimplifyMarkupSettings это лучший способ для меня. Спасибо брат ;) –

 Смежные вопросы

  • Нет связанных вопросов^_^