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