Share via


Recuperar una lista de las hojas de cálculo ocultas 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 una lista de hojas de cálculo ocultas en un libro de Microsoft Excel 2010 o Microsoft Excel 2010, sin cargar el documento en Excel. Incluye un método GetHiddenSheets de ejemplo para ilustrar esta tarea.

Método GetHiddenSheets

Puede usar el método GetHiddenSheets para recuperar una lista de las hojas de cálculo ocultas de un libro. El método GetHiddenSheets acepta un solo parámetro, una cadena que indica la ruta de acceso del archivo que se desea examinar. El método funciona con el libro que especifique, rellenando una instancia de List<T> con una referencia a cada objeto Sheet oculto.

Recuperar la colección de hojas de cálculo

La clase WorkbookPart proporciona una propiedad Workbook , que a su vez contiene el contenido XML del libro. Aunque el SDK de Open XML proporciona la propiedad Sheets , que devuelve una colección de los elementos Sheet , toda la información que necesita la proporcionan los elementos Sheet dentro del contenido XML del libro . El código siguiente usa el método genérico Descendants del objeto Workbook para recuperar una colección de objetos Sheet que contienen información sobre todos los elementos secundarios de hoja del contenido XML del libro.

WorkbookPart? wbPart = document.WorkbookPart;

if (wbPart is not null)
{
    var sheets = wbPart.Workbook.Descendants<Sheet>();

Recuperar hojas ocultas

Es importante tener en cuenta que Excel admite dos niveles de hojas de cálculo. Puede ocultar una hoja de cálculo mediante la interfaz de usuario de Excel haciendo clic con el botón secundario en la pestaña de hojas de cálculo y seleccionando la opción de ocultar la hoja de cálculo. Para estas hojas de cálculo, la propiedad State del objeto Sheet contiene un valor enumerado de Hidden. También puede convertir una hoja en muy oculta escribiendo código (en VBA o en otro lenguaje) que defina la propiedad Visible de la hoja como el valor enumerado xlSheetVeryHidden. Para las hojas de cálculo ocultas de esta manera, la propiedad State del objeto Sheet contiene el valor enumerado VeryHidden.

Dada la colección que contiene información sobre todas las hojas, el código siguiente usa la función Where para filtrar la colección de modo que contenga solo las hojas en las que la propiedad State no sea null. Si la propiedad State no es null, el código busca los objetos Sheet en los que la propiedad State es un valor y donde el valor es SheetStateValues.Hidden o SheetStateValues.VeryHidden.

var hiddenSheets = sheets.Where((item) => item.State is not null &&
    item.State.HasValue &&
    (item.State.Value == SheetStateValues.Hidden ||
    item.State.Value == SheetStateValues.VeryHidden));

Código de ejemplo

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

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

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

    using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart? wbPart = document.WorkbookPart;

        if (wbPart is not null)
        {
            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 is not null &&
                item.State.HasValue &&
                (item.State.Value == SheetStateValues.Hidden ||
                item.State.Value == SheetStateValues.VeryHidden));

            returnVal = hiddenSheets.ToList();
        }
    }

    return returnVal;
}