Как получить части верхнего / нижнего колонтитула из документа Excel - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь получить части верхнего / нижнего колонтитула из документа 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!).

К сожалению, API для Excel в openxml хуже, так как в 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 говорят, что я должен запросить потомков листа (код из эта ссылка ):

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 голосов
/ 26 марта 2019

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, поскольку он более сложный, чем вы можете себе представить. Документацию можно найти в разделе 18.3.1.46 пятого издания Ecma Office Open XML Part 1. Справочник по основам и языку разметки, который можно найти здесь .

...