如何从Excel文档中获取页眉/页脚部分

时间:2019-03-25 17:33:05

标签: excel openxml openxml-sdk

我正在尝试从excel文档中获取页眉/页脚部分,以便可以对其内容进行处理,但是似乎无法从中获取任何内容。

我认为这将非常简单...考虑以下代码:

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(filePath, true))
{
    var headers = spreadsheet.GetPartsOfType<HeaderPart>().ToList();

    foreach (var header in headers)
    {
        //do something
    }
}

即使文件包含标头,标头也始终为空。我曾尝试深入workbook -> worksheets -> etc,但一无所获。我测试的excel文件中肯定有一个标头(标头在excel中太可怕了!)。

令人讨厌的是,openxml中excel的api似乎更糟,因为在docx中,您可以通过调用以下命令获取标头:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filePath, true))
{
    MainDocumentPart documentPart = wordDoc.MainDocumentPart;

    var headerParts = wordDoc.MainDocumentPart.HeaderParts.ToList();

    foreach (var headerPart in headerParts)
    {
        //do something
    }
} 

我在Google上看到一些人说我应该查询工作表的后代(来自this link的代码):

HeaderFooter hf = ws.Descendants<HeaderFooter>().FirstOrDefault();
if (hf != null)
{
//here you can add your code
//I just try to append here for demo
  hf = new HeaderFooter();
  ws.AppendChild<HeaderFooter>(hf);
}

但是我看不到用.Descendants查询工作簿/工作表/任何东西的任何方式,显然Google上的代码示例都没有显示它们是如何获得ws的。

有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:0)

作为第二个示例,

HeaderFooter是使用OpenXML从电子表格读取页眉或页脚的正确方法。您的示例中的ws指的是Worksheet

以下是读取HeaderFooter并将InnerText转储到控制台的示例。

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    Worksheet ws = worksheetPart.Worksheet;

    HeaderFooter hf = ws.Descendants<HeaderFooter>().FirstOrDefault();

    if (hf != null)
    {
        Console.WriteLine(hf.InnerText);
    }
}

我强烈建议您阅读HeaderFooter元素的文档,因为它比您想象的要复杂。该文档可以在Ecma Office Open XML第5部分第1部分-基本原理和标记语言参考的第18.3.1.46节中找到,该文档可以在here中找到。