Partager via


Récupérer une liste des lignes ou colonnes masquées dans un document de feuille de calcul

Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin de récupérer par programmation une liste de lignes ou de colonnes masquées dans une feuille de calcul Microsoft Excel. Elle contient un exemple de la méthode GetHiddenRowsOrCols pour illustrer cette tâche.


Méthode GetHiddenRowsOrCols

Vous pouvez utiliser la méthode GetHiddenRowsOrCols pour récupérer une liste des lignes ou des colonnes masquées dans une feuille de calcul. La méthode retourne une liste d’entiers non signés qui contiennent chaque index pour les lignes ou colonnes masquées, si la feuille de calcul spécifiée contient des lignes ou des colonnes masquées (les lignes et colonnes sont numérotées à partir de 1, au lieu de 0). La méthode GetHiddenRowsOrCols accepte trois paramètres :

  • Le nom du document à examiner (chaîne).

  • Le nom de la feuille à examiner (chaîne).

  • S'il faut détecter des lignes (true) ou des colonnes (false) (valeur booléenne).


Fonctionnement du code

Le code ouvre le document en utilisant la méthode SpreadsheetDocument.Open et en indiquant que le document doit être ouvert pour l’accès en lecture seule (la valeur finale du paramètre false ). Ensuite, le code récupère une référence à la partie classeur, à l’aide de la propriété WorkbookPart du document.

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

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

Pour trouver les lignes ou les colonnes masquées, le code doit d'abord récupérer une référence à la feuille spécifiée, en fonction de son nom. Cela n'est pas aussi simple que vous pourriez le penser. Le code doit examiner tous les descendants de type feuille de la propriété Workbook du composant de classeur, en examinant la propriété Name de chaque feuille qu’il trouve. Notez que cette recherche examine simplement les relations du classeur, et ne cherche pas réellement une partie de classeur. Il trouve simplement une référence à un objet Sheet , qui contient des informations telles que le nom et la propriété Id de la feuille. La manière la plus simple de procéder consiste à utiliser une requête LINQ.

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

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

Les informations de feuille que vous avez déjà récupérées fournissent une propriété Id et, étant donné cette propriété Id , le code peut récupérer une référence à la propriété WorksheetPart correspondante en appelant la méthode GetPartById de l’objet WorkbookPart .


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

Récupération de la liste des valeurs d’index de lignes ou de colonnes masquées

Le code utilise le paramètre detectRows que vous avez spécifié lorsque vous avez appelé la méthode pour déterminer s’il faut récupérer des informations sur les lignes ou les colonnes. Le code qui récupère réellement la liste des lignes masquées ne nécessite qu’une seule ligne de code.

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

La récupération de la liste des colonnes masquées est un peu plus délicate, car Excel réduit les groupes de colonnes masquées en un seul élément et fournit des propriétés Min et Max qui décrivent les première et dernière colonnes du groupe. Le code qui récupère la liste des colonnes masquées commence donc de la même manière que celui qui récupère les lignes masquées. Toutefois, il doit itérer au sein des valeurs d’index (boucler chaque élément de la collection de colonnes masquées, ajouter chaque index de min à la valeur Max , inclusivement).

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

Exemple de code

Voici l'exemple de code GetHiddenRowsOrCols complet en C# et 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;
}

Voir aussi