Compartilhar via


Obter um dicionário de todos os intervalos com nome num documento de folha de cálculo

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para obter programaticamente um dicionário que contém os nomes e intervalos de todos os nomes definidos num livro do Microsoft Excel. Contém um método GetDefinedNames de exemplo para ilustrar esta tarefa.

GetDefinedNames Method

O método GetDefinedNames aceita um único parâmetro que indica o nome do documento a partir do qual obter os nomes definidos. O método devolve uma Dictionary<TKey,TValue> instância que contém informações sobre os nomes definidos no livro especificado, que podem estar vazios se não existirem nomes definidos.

Como Funciona o Código

O código abre o documento da folha de cálculo, utilizando o método Abrir , indicando que o documento deve estar aberto para acesso só de leitura com o parâmetro falso final. Dado o livro aberto, o código utiliza a propriedade WorkbookPart para navegar para a main parte do livro. O código armazena esta referência numa variável chamada 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;

Obter os Nomes Definidos

Tendo em conta a parte do livro, o passo seguinte é simples. O código utiliza a propriedade Livro da parte do livro para obter uma referência ao conteúdo do livro e, em seguida, obtém a coleção DefinedNames fornecida pelo SDK Open XML. Esta propriedade devolve uma coleção de todos os nomes definidos que estão contidos no livro. Se a propriedade devolver um valor não nulo, o código itera através da coleção, obtendo informações sobre cada peça nomeada e adicionando o nome da chave) e o valor (descrição do intervalo) ao dicionário para cada nome definido.

// 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);
        }
    }
}

Código de exemplo

Segue-se o exemplo de código GetDefinedNames completo em C# e 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;
}