2010-07-06 20 views
2

J'ai besoin de récupérer les parties d'en-tête/pied de page d'un document OpenXML dans l'ordre dans lequel elles apparaissent dans le document.Ordre des en-têtes/pieds de page dans le document OpenXML

suivantes: -

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

-appears à itérer à travers le HeaderParts sans ordre particulier.

Quelqu'un peut-il expliquer comment les commander correctement? Soit en utilisant OrderBy, ou en accédant au HeaderParts différemment?

Edit: Exemples

Par exemple: -

Dans un document exemple, j'ai plusieurs sauts de section. Chaque section a un en-tête/pied de page différent: -

  • Section 1 => Section 1 pied
  • Section 2 => Section 2 Pied de page
  • Section 3 => Section 3 Pied de page
  • Section 4 => Section 4 Pied de page

Il n'y a pas d'en-têtes ou de pieds de page «différents de première page» ou «différents» dans le document. Lorsque je tente d'itérer sur ces pieds en utilisant document.MainDocumentPart.FooterParts, ils n'apparaissent pas dans l'ordre 1, 2, 3, 4. Je n'ai pas pu déterminer la logique derrière l'ordre dans lequel ces pieds apparaissent dans la séquence. Je soupçonne qu'ils ne sont pas commandés.

J'ai besoin d'eux dans l'ordre.

Répondre

1

Vous ne voulez pas réellement obtenir les parties d'en-tête/pied de page en premier, vous voulez les placer dans le document.xml dans l'ordre où elles apparaissent - et ensuite accéder à leurs parties. Pour cela, vous aurez besoin de quelque chose comme Linq pour interroger le document principal. Après cela, vous pouvez obtenir leurs identifiants de relation et à partir de là utiliser l'emballage pour obtenir la pièce réelle. Mais pour commencer, vous aurez besoin pour se rendre à l'XElement, comme ceci:

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 

Désolé pour le VB.NET - Je ne sais pas C#. Mais le concept est le même.

+0

Ce n'est certainement pas un artefact de "foreach". Les pieds de page apparaissent dans la séquence dans le mauvais ordre pour commencer. –

+0

voulez-vous dire qu'ils apparaissent à l'envers? Cette raison pour cela dans Open XML est due à l'ordre z des endroits où les objets doivent apparaître. –

+0

Non, ils apparaissent dans un ordre imprévisible. Parfois vers l'avant, parfois vers l'arrière, parfois mélangé. –