Share via


Recuperar una lista de las filas o columnas 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 filas o columnas ocultas en una hoja de cálculo de Microsoft Excel. Incluye un método GetHiddenRowsOrCols de ejemplo para ilustrar esta tarea.


Método GetHiddenRowsOrCols

Puede usar el método GetHiddenRowsOrCols para recuperar una lista de las filas o columnas ocultas de una hoja de cálculo. El método devuelve una lista de enteros sin signo que contienen cada índice de las filas o columnas ocultas, si la hoja de cálculo especificada contiene filas o columnas ocultas (las filas y columnas se numeran a partir de 1, en lugar de 0). El método GetHiddenRowsOrCols acepta tres parámetros:

  • El nombre del documento que se desea examinar (cadena).

  • El nombre de la hoja que se desea examinar (cadena).

  • Si se deben detectar filas (true) o columnas (false) (booleano).


Funcionamiento del código

El código abre el documento mediante el método SpreadsheetDocument.Open e indica que el documento debe estar abierto para el acceso de solo lectura (el valor final del parámetro false ). A continuación, el código recupera una referencia a la parte del libro mediante la propiedad WorkbookPart del documento.

List<uint> itemList = new List<uint>();

using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
    if (document is not null)
    {
        WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();

Para buscar las filas o columnas ocultas, el código debe recuperar primero una referencia a la hoja especificada, según su nombre. No es tan fácil como se pueda pensar. El código debe examinar todos los descendientes de tipo hoja de la propiedad Workbook del elemento del libro, examinando la propiedad Name de cada hoja que encuentre. Tenga en cuenta que esta búsqueda simplemente examina las relaciones del libro y, en realidad, no busca una parte de hoja de cálculo. Simplemente encuentra una referencia a un objeto Sheet , que contiene información como el nombre y la propiedad Id de la hoja. La forma más simple de conseguirlo es usar una consulta LINQ.

Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);

if (theSheet is null || theSheet.Id is null)
{
    throw new ArgumentException("sheetName");
}

La información de hoja que ya ha recuperado proporciona una propiedad Id y, dado que la propiedad Id , el código puede recuperar una referencia a la propiedad WorksheetPart correspondiente llamando al método GetPartById del objeto WorkbookPart .


// The sheet does exist.
WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
Worksheet? ws = wsPart?.Worksheet;

Recuperar la lista de valores de índice de filas o columnas ocultas

El código usa el parámetro detectRows que especificó cuando llamó al método para determinar si se debe recuperar información sobre filas o columnas. El código que recupera realmente la lista de filas ocultas solo requiere una sola línea de código.

// Retrieve hidden rows.
itemList = ws.Descendants<Row>()
    .Where((r) => r?.Hidden is not null && r.Hidden.Value)
    .Select(r => r.RowIndex?.Value)
    .Cast<uint>()
    .ToList();

Recuperar la lista de columnas ocultas es un poco más complicado, ya que Excel contrae grupos de columnas ocultas en un solo elemento y proporciona propiedades Min y Max que describen la primera y la última columnas del grupo. Por tanto, el código que recupera la lista de columnas ocultas empieza igual que el código que recupera las filas ocultas. Sin embargo, debe recorrer en iteración los valores de índice (en bucle cada elemento de la colección de columnas ocultas, agregando cada índice del mínimo al valor Máximo , de forma inclusiva).

var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);

foreach (Column item in cols)
{
    if (item.Min is not null && item.Max is not null)
    {
        for (uint i = item.Min.Value; i <= item.Max.Value; i++)
        {
            itemList.Add(i);
        }
    }
}

Código de ejemplo

A continuación se incluye el ejemplo de código GetHiddenRowsOrCols 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<uint> GetHiddenRowsOrCols(string fileName, string sheetName, string detectRows = "false")
{
    // Given a workbook and a worksheet name, return 
    // either a list of hidden row numbers, or a list 
    // of hidden column numbers. If detectRows is true, return
    // hidden rows. If detectRows is false, return hidden columns. 
    // Rows and columns are numbered starting with 1.
    List<uint> itemList = new List<uint>();

    using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        if (document is not null)
        {
            WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();

            Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);

            if (theSheet is null || theSheet.Id is null)
            {
                throw new ArgumentException("sheetName");
            }
            else
            {

                // The sheet does exist.
                WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
                Worksheet? ws = wsPart?.Worksheet;

                if (ws is not null)
                {
                    if (detectRows.ToLower() == "true")
                    {
                        // Retrieve hidden rows.
                        itemList = ws.Descendants<Row>()
                            .Where((r) => r?.Hidden is not null && r.Hidden.Value)
                            .Select(r => r.RowIndex?.Value)
                            .Cast<uint>()
                            .ToList();
                    }
                    else
                    {
                        // Retrieve hidden columns.
                        var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);

                        foreach (Column item in cols)
                        {
                            if (item.Min is not null && item.Max is not null)
                            {
                                for (uint i = item.Min.Value; i <= item.Max.Value; i++)
                                {
                                    itemList.Add(i);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return itemList;
}

Consulte también