2010-07-06 2 views
2

Мне нужно получить части заголовка/нижнего колонтитула из документа OpenXML в том порядке, в котором они отображаются в документе.Порядок заголовков/нижних колонтитулов в документе OpenXML

Следующая: -

foreach (HeaderPart header in document.MainDocumentPart.HeaderParts) 
{ 
    ... 
} 

-appears для перебора HeaderParts в произвольном порядке.

Может ли кто-нибудь объяснить, как правильно их заказать? Либо с помощью OrderBy, либо путем доступа к HeaderParts по-другому?

Edit: Примеры

Например: -

В качестве примера документа, у меня есть несколько разрывов разделов. Каждая секция имеет другой заголовок/нижний колонтитул: -

  • Раздел 1 => Раздел 1 нижних колонтитул
  • Раздел 2 => Раздел 2 нижних колонтитул
  • Раздел 3 => Раздел 3 нижнего колонтитул
  • Раздел 4 => Раздел 4 Нижний колонтитул

В документе нет верхних или нижних колонтитулов «другая первая страница» или «разные четные/четные».

Когда я пытаюсь перебрать эти нижние колонтитулы с помощью document.MainDocumentPart.FooterParts, они не отображаются в порядке 1, 2, 3, 4. Я не смог определить логику порядка, который эти нижние колонтитулы появляются в последовательности. Я подозреваю, что они не заказаны.

Мне нужны они в порядке.

ответ

1

Вы не хотите сначала получать части заголовка/нижнего колонтитула, вы хотите получить их внутри document.xml в том порядке, в котором они появляются, и затем получить доступ к их частям. Для этого вам потребуется что-то вроде Linq для запроса основного документа. После этого вы можете получить свои идентификаторы отношений и оттуда использовать упаковку, чтобы получить фактическую часть. Но для начала, вам нужно добраться до XElement, как так:

Imports System.Linq 
Imports <xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 

Module Module1 
    Sub Main() 
     Dim doc As String = "C:\headers.docx" 
     Dim wordDoc = WordprocessingDocument.Open(doc, False) 
     Using wordDoc 
      Dim mainPart = wordDoc.MainDocumentPart 
      Dim docStream As System.IO.StreamReader = New IO.StreamReader(mainPart.GetStream) 
      Dim xDoc As XElement = XElement.Load(docStream) 
      Dim sectionHeaders = From e In xDoc...<w:sectPr> Select e.<w:headerReference> 
     End Using 
    End Sub 

End Module 

Извините за VB.NET - я не знаю, C#. Но концепция такая же.

+0

Это определенно не артефакт «foreach». Нижние колонтитулы появляются в последовательности в неправильном порядке для начала. –

+0

Вы имеете в виду, что они появляются в обратном направлении? Причина этого в Open XML заключается в том, что z-порядок появления объектов должен быть. –

+0

Нет, они появляются в непредсказуемом порядке. Иногда вперед, иногда назад, иногда смешанные. –

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