Share via


Recuperar un diccionario de todos los rangos con nombre en un documento de hoja de cálculo

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para recuperar mediante programación un diccionario que contiene los nombres y rangos de todos los nombres definidos en un libro de Microsoft Excel 2010 o Microsoft Excel 2013. Contiene un ejemplo del método GetDefinedNames para ilustrar esta tarea.

Método GetDefinedNames

El método GetDefinedNames acepta un único parámetro que indica el nombre del documento desde el que se van a recuperar los nombres definidos. El método devuelve una instancia de Dictionary que contiene información sobre los nombres definidos en el libro especificado, que puede estar vacío si no hay nombres definidos.

Funcionamiento del código

El código abre el documento de hoja de cálculo mediante el método Open , lo que indica que el documento debe estar abierto para el acceso de solo lectura con el parámetro false final. Dado el libro abierto, el código usa la propiedad WorkbookPart para navegar a la parte principal del libro. El código almacena esta referencia en una variable llamada 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;

Recuperación de los nombres definidos

Una vez completada la parte del libro, el siguiente paso es sencillo. El código usa la propiedad Workbook de la parte del libro para recuperar una referencia al contenido del libro y, a continuación, recupera la colección DefinedNames proporcionada por el SDK de Open XML. Esta propiedad devuelve una colección de todos los nombres definidos que contiene el libro. Si la propiedad devuelve un valor que no es null, el código recorre en iteración la colección, recuperando información sobre cada parte con nombre y agregando el nombre de clave) y el valor (descripción del intervalo) al diccionario para cada nombre 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 ejemplo

A continuación, se incluye el código de ejemplo completo GetDefinedNames en C# y Visual Basic.

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

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