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. Il contient un exemple GetHiddenRowsOrCols
de méthode pour illustrer cette tâche.
Méthode GetHiddenRowsOrCols
Vous pouvez utiliser la GetHiddenRowsOrCols
méthode pour récupérer une liste des lignes ou 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 DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open*> et en indiquant que le document doit être ouvert pour l’accès en lecture seule (la valeur finale false
du paramètre). Ensuite, le code récupère une référence à la partie classeur, à l’aide de la WorkbookPart propriété du document.
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é du composant de Workbook classeur, en examinant la Name propriété 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 Sheet objet, qui contient des informations telles que le nom et Id la propriété 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);
Les informations de feuille que vous avez déjà récupérées fournissent une Id
propriété et, étant donné cette Id
propriété, le code peut récupérer une référence à la propriété correspondante WorksheetPart en appelant la GetPartById méthode 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 detectRows
paramètre 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 Min propriétés et Max qui décrivent la première et la 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 (en boucle chaque élément de la collection de colonnes masquées, en ajoutant chaque index à Min
la Max
valeur, 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 complet GetHiddenRowsOrCols
en C# et Visual Basic.
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;
}