【问题标题】:Order of Header/FooterParts in OpenXML documentOpenXML 文档中页眉/页脚部分的顺序
【发布时间】:2010-07-23 01:00:45
【问题描述】:

我需要按照它们在文档中出现的顺序从 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 的顺序出现。我无法确定这些页脚按顺序出现的顺序背后的逻辑.我怀疑它们没有被订购。

我需要它们。

【问题讨论】:

    标签: c# ms-word openxml-sdk openxml


    【解决方案1】:

    您实际上并不希望首先获取页眉/页脚部分,您希望按照它们出现的顺序将它们放入 document.xml - 然后访问它们的部分。为此,您需要像 Linq 这样的东西来查询主文档。之后,您可以获取他们的关系 ID,并从那里使用包装来获取实际部分。但首先,您需要访问 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#。但概念是一样的。

    【讨论】:

    • 这绝对不是“foreach”的产物。页脚以错误的顺序出现在开始的顺序中。
    • 你的意思是他们倒着出现吗?在 Open XML 中这样做的原因是对象应该出现的位置的 z 顺序。
    • 不,它们以不可预知的顺序出现。有时向前,有时向后,有时混合。
    • 我已经改变了上面的答案。
    • 好了。我们实际上最终做的是从 MainDocumentPart.Parts 中获取它们,按关系 id 排序(很棘手,因为 id 的形式是“rIdXX”)。我怀疑这一直是问题所在 - FooterParts 是使用整个关系 id 上的字符串排序来排序的(所以“rId11”在“rId9”之前)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2016-03-04
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多