Порядок заголовка / нижнего колонтитула в документе OpenXML - PullRequest
2 голосов
/ 06 июля 2010

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

Следующее: -

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

- появляется для итерации по HeaderParts в произвольном порядке.

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

Редактировать: Примеры

Например: -

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

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

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

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

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

1 Ответ

1 голос
/ 06 июля 2010

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

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 #.Но концепция та же самая.

...