我正在尝试从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
的。
有什么想法吗?谢谢
答案 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中找到。