Поделиться через


Получение списка скрытых листов электронной таблицы

В этом разделе показано использование классов пакета SDK Open XML версии 2.0 для Microsoft Office для извлечения программным способом списка скрытых листов книги Microsoft Office Excel 2007 или Microsoft Excel 2010 без необходимости загрузки документа в приложение Excel. Для иллюстрации данной задачи в разделе приведен пример использования метода GetHiddenSheets.

Дата последнего изменения: 18 ноября 2011 г.

Применимо к: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

В этой статье
Метод GetHiddenSheets
Вызов метода GetHiddenSheets
Принципы работы кода
Получение коллекции листов
Получение скрытых листов
Пример кода

Чтобы использовать пример кода, приведенный в разделе, необходимо установить пакет Open XML SDK 2.0 (Возможно, на английском языке). В проекте необходимо явно указать следующие сборки:

  • WindowsBase.

  • DocumentFormat.OpenXml (устанавливается вместе с пакетом Open XML SDK).

Для компиляции кода, представленного в этом разделе, необходимо также использовать следующие директивы using или инструкции Imports:

using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
Imports DocumentFormat.OpenXml.Spreadsheet
Imports DocumentFormat.OpenXml.Packaging

Метод GetHiddenSheets

Метод GetHiddenSheets, показанный в следующем коде, используется для получения списка скрытых листов книги. Метод GetHiddenSheets принимает один строковый параметр, указывающий путь к файлу, который требуется обработать.

public static List<Sheet> GetHiddenSheets(string fileName)
Public Function GetHiddenSheets(ByVal fileName As String) As List(Of Sheet)

Метод работает с заданной книгой, заполняя экземпляр List<T> ссылками на все скрытые объекты Sheet.

Вызов метода GetHiddenSheets

Метод возвращает универсальный список, содержащий данные об отдельных объектах Sheet. Чтобы вызвать метод GetHiddenWorksheets, передайте требуемое значение параметра, как показано в следующем коде:

// Revise this path to the location of a file that contains hidden worksheets.
const string DEMOPATH = 
    @"C:\Users\Public\Documents\HiddenSheets.xlsx";
List<Sheet> sheets = GetHiddenSheets(DEMOPATH);
foreach (var sheet in sheets)
{
    Console.WriteLine(sheet.Name);
}
' Revise this path to the location of a file that contains hidden worksheets.
Const DEMOPATH As String =
    "C:\Users\Public\Documents\HiddenSheets.xlsx"
Dim sheets As List(Of Sheet) = GetHiddenSheets(DEMOPATH)
For Each sheet In sheets
    Console.WriteLine(sheet.Name)
Next

Принципы работы кода

Следующий код начинается с создания универсального списка, который будет содержать данные о скрытых листах:

List<Sheet> returnVal = new List<Sheet>();
Dim returnVal As New List(Of Sheet)

Затем следующий код открывает указанную книгу с помощью метода SpreadsheetDocument.Open и указывая, что документ должен быть открыт в режиме "Только для чтения" (значение последнего параметра false). После открытия книги код использует свойство WorkbookPart для перехода к основной части книги, сохраняя ссылку в переменной wbPart.

using (SpreadsheetDocument document = 
    SpreadsheetDocument.Open(fileName, false))
{
    WorkbookPart wbPart = document.WorkbookPart;
    // Code removed here… 
}
return returnVal;
Using document As SpreadsheetDocument =     SpreadsheetDocument.Open(fileName, False)
    Dim wbPart As WorkbookPart = document.WorkbookPart
    ' Code removed here…
End Using
Return returnVal

Получение коллекции листов

Класс WorkbookPart предоставляет свойство Workbook, содержащее XML-содержимое книги. Хотя пакет SDK Open XML версии 2.0 и предоставляет свойство Sheets, возвращающее коллекцию частей Sheet, все необходимые нам данные предоставляются элементами Sheet, которые хранятся в XML-содержимом Workbook. Следующий код использует универсальный метод Descendants объекта Workbook для получения коллекции объектов Sheet, содержащих данные обо всех дочерних элементах XML-содержимого книги.

var sheets = wbPart.Workbook.Descendants<Sheet>();
Dim sheets = wbPart.Workbook.Descendants(Of Sheet)()

Получение скрытых листов

Важно знать, что Excel поддерживает два уровня скрытия листов. Лист можно скрыть с помощью пользовательского интерфейса Excel, щелкнув правой кнопкой мыши вкладку листа и выбрав команду скрытия листа. Для таких листов свойство State объекта Sheet содержит перечислимое значение Hidden. Лист можно дополнительно скрыть при помощи кода (на VBA или другом языке), который присваивает свойству Visible листа перечислимое значение xlSheetVeryHidden. Для листов, скрытых таким образом, свойство State объекта Sheet содержит перечислимое значение VeryHidden.

Имея коллекцию, содержащую данные обо всех листах, следующий код использует функцию Where для фильтрации коллекции таким образом, чтобы остались только те листы, в которых свойство State не нулевое. Если свойство State не нулевое, код ищет объекты Sheet, в которых свойство State имеет значение SheetStateValues.Hidden или SheetStateValues.VeryHidden.

var hiddenSheets = sheets.Where((item) => item.State != null && 
    item.State.HasValue && 
    (item.State.Value == SheetStateValues.Hidden || 
    item.State.Value == SheetStateValues.VeryHidden));
Dim hiddenSheets = sheets.Where(Function(item) item.State IsNot
    Nothing AndAlso item.State.HasValue _
    AndAlso (item.State.Value = SheetStateValues.Hidden Or _
        item.State.Value = SheetStateValues.VeryHidden))

Наконец, следующий код вызывает метод ToList<TSource> для выполнения запроса LINQ, который получает список скрытых листов и помещает результаты в возвращаемое значение функции.

returnVal = hiddenSheets.ToList();
returnVal = hiddenSheets.ToList()

Пример кода

Далее приведен полный пример кода GetHiddenSheets на C# и Visual Basic.

public static List<Sheet> GetHiddenSheets(string fileName)
{
    List<Sheet> returnVal = new List<Sheet>();

    using (SpreadsheetDocument document = 
        SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart wbPart = document.WorkbookPart;
        var sheets = wbPart.Workbook.Descendants<Sheet>();

        // Look for sheets where there is a State attribute defined, 
        // where the State has a value,
        // and where the value is either Hidden or VeryHidden.
        var hiddenSheets = sheets.Where((item) => item.State != null &&
            item.State.HasValue &&
            (item.State.Value == SheetStateValues.Hidden ||
            item.State.Value == SheetStateValues.VeryHidden));

        returnVal = hiddenSheets.ToList();
    }
    return returnVal;
}
Public Function GetHiddenSheets(ByVal fileName As String) As List(Of Sheet)
    Dim returnVal As New List(Of Sheet)

    Using document As SpreadsheetDocument =
        SpreadsheetDocument.Open(fileName, False)

        Dim wbPart As WorkbookPart = document.WorkbookPart
        Dim sheets = wbPart.Workbook.Descendants(Of Sheet)()

        ' Look for sheets where there is a State attribute defined, 
        ' where the State has a value,
        ' and where the value is either Hidden or VeryHidden:
        Dim hiddenSheets = sheets.Where(Function(item) item.State IsNot
            Nothing AndAlso item.State.HasValue _
            AndAlso (item.State.Value = SheetStateValues.Hidden Or _
                item.State.Value = SheetStateValues.VeryHidden))

        returnVal = hiddenSheets.ToList()
    End Using
    Return returnVal
End Function

См. также

Ссылка

Class Library Reference

Другие ресурсы

Retrieving a List of Hidden Worksheets from Excel 2010 Workbooks by Using the Open XML SDK 2.0