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


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

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного извлечения словаря, содержащего имена и диапазоны всех определенных имен в книге Microsoft Excel. Он содержит пример метода GetDefinedNames для иллюстрации этой задачи.

Метод GetDefinedNames

Метод GetDefinedNames принимает один параметр, указывающий имя документа, из которого извлекаются определенные имена. Метод возвращает Dictionary<TKey,TValue> экземпляр, содержащий сведения об определенных именах в указанной книге, которые могут быть пустыми, если нет определенных имен.

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

Код открывает документ электронной таблицы с помощью метода Open , указывающего, что документ должен быть открыт для доступа только для чтения с окончательным параметром false. Учитывая открытую книгу, код использует свойство WorkbookPart для перехода к части книги main. Код сохраняет эту ссылку в переменной с именем wbPart.

// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
    // Retrieve a reference to the workbook part.
    var wbPart = document.WorkbookPart;

Получение определенных имен

С учетом части книги следующий шаг прост. Код использует свойство Workbook части книги для получения ссылки на содержимое книги, а затем извлекает коллекцию DefinedNames , предоставляемую пакетом SDK Open XML. Это свойство возвращает коллекцию всех определенных имен, содержащихся в книге. Если свойство возвращает значение, отличное от NULL, код затем выполняет итерацию по коллекции, извлекая сведения о каждой именованной части и добавляя имя ключа) и значение (описание диапазона) в словарь для каждого определенного имени.

// Retrieve a reference to the defined names collection.
DefinedNames? definedNames = wbPart?.Workbook?.DefinedNames;

// If there are defined names, add them to the dictionary.
if (definedNames is not null)
{
    foreach (DefinedName dn in definedNames)
    {
        if (dn?.Name?.Value is not null && dn?.Text is not null)
        {
            returnValue.Add(dn.Name.Value, dn.Text);
        }
    }
}

Пример кода

Ниже приведен полный пример кода GetDefinedNames в C# и Visual Basic.

static Dictionary<String, String>GetDefinedNames(String fileName)
{
    // Given a workbook name, return a dictionary of defined names.
    // The pairs include the range name and a string representing the range.
    var returnValue = new Dictionary<String, String>();

    // Open the spreadsheet document for read-only access.
    using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        // Retrieve a reference to the workbook part.
        var wbPart = document.WorkbookPart;


        // Retrieve a reference to the defined names collection.
        DefinedNames? definedNames = wbPart?.Workbook?.DefinedNames;

        // If there are defined names, add them to the dictionary.
        if (definedNames is not null)
        {
            foreach (DefinedName dn in definedNames)
            {
                if (dn?.Name?.Value is not null && dn?.Text is not null)
                {
                    returnValue.Add(dn.Name.Value, dn.Text);
                }
            }
        }

    }

    return returnValue;
}