Abrufen einer Liste der ausgeblendeten Zeilen oder Spalten in einem Tabellenkalkulationsdokument
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um programmgesteuert eine Liste ausgeblendeter Zeilen oder Spalten in einem Microsoft Excel-Arbeitsblatt abzurufen. Diese Aufgabe wird mithilfe eines Beispiels der GetHiddenRowsOrCols-Methode veranschaulicht.
GetHiddenRowsOrCols-Methode
Mit der GetHiddenRowsOrCols-Methode können Sie eine Liste ausgeblendeter Zeilen oder Spalten in einem Arbeitsblatt abrufen. Die Methode gibt eine Liste von ganzen Zahlen ohne Vorzeichen zurück, die jeden Index für die ausgeblendeten Zeilen oder Spalten enthalten, wenn das angegebene Arbeitsblatt ausgeblendete Zeilen oder Spalten enthält (Zeilen und Spalten werden ab 1 und nicht mit 0 nummeriert). Die GetHiddenRowsOrCols-Methode akzeptiert drei Parameter:
Den Namen des zu untersuchenden Dokuments (Zeichenfolge)
Den Namen des zu untersuchenden Arbeitsblatts (Zeichenfolge)
Die zu erkennenden Elemente: Zeilen (True) oder Spalten (False) (boolesch).
Funktionsweise des Codes
Der Code öffnet das Dokument mithilfe der SpreadsheetDocument.Open-Methode und gibt an, dass das Dokument für den schreibgeschützten Zugriff geöffnet sein soll (der endgültige False-Parameterwert ). Als Nächstes ruft der Code mithilfe der WorkbookPart-Eigenschaft des Dokuments einen Verweis auf den Arbeitsmappenteil ab.
List<uint> itemList = new List<uint>();
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
if (document is not null)
{
WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();
Um die ausgeblendeten Zeilen oder Spalten zu finden, muss der Code zunächst einen Verweis auf das angegebene Blatt unter Berücksichtigung seines Namens abrufen. Das ist nicht so einfach, wie Sie vielleicht denken. Der Code muss alle Blatttyp-Nachfolger der Workbook-Eigenschaft des Arbeitsmappenteils durchsuchen und die Name-Eigenschaft jedes gefundenen Blatts untersuchen. Beachten Sie, dass diese Suche einfach die Beziehungen der Arbeitsmappe durchsucht und keinen Arbeitsblattteil findet. Es findet einfach einen Verweis auf ein Sheet-Objekt , das Informationen wie den Namen und die Id-Eigenschaft des Blatts enthält. Die einfachste Möglichkeit, dies zu erreichen, ist die Verwendung einer LINQ-Abfrage.
Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);
if (theSheet is null || theSheet.Id is null)
{
throw new ArgumentException("sheetName");
}
Die bereits abgerufenen Blattinformationen stellen eine Id-Eigenschaft bereit, und angesichts dieser Id-Eigenschaft kann der Code einen Verweis auf die entsprechende WorksheetPart-Eigenschaft abrufen, indem die GetPartById-Methode des WorkbookPart-Objekts aufgerufen wird.
// The sheet does exist.
WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
Worksheet? ws = wsPart?.Worksheet;
Abrufen der Liste der Indexwerte ausgeblendeter Zeilen oder Spalten
Der Code verwendet den detectRows-Parameter , den Sie beim Aufrufen der -Methode angegeben haben, um zu bestimmen, ob Informationen zu Zeilen oder Spalten abgerufen werden sollen. Der Code, der die Liste der ausgeblendeten Zeilen tatsächlich abruft, erfordert nur eine einzige Codezeile.
// 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();
Das Abrufen der Liste der ausgeblendeten Spalten ist etwas schwieriger, da Excel Gruppen ausgeblendeter Spalten in ein einzelnes Element reduziert und die Eigenschaften Min und Max bereitstellt, die die erste und letzte Spalte in der Gruppe beschreiben. Deshalb ist der Code zum Abrufen der Liste ausgeblendeter Spalten anfangs mit dem Code zum Abrufen ausgeblendeter Zeilen identisch. Sie muss jedoch die Indexwerte durchlaufen (wobei jedes Element in der Auflistung ausgeblendeter Spalten in einer Schleife ausgeführt wird, wobei jeder Index vom Min-Wert zum Max-Wert (einschließlich) hinzugefügt wird.
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);
}
}
}
Beispielcode
Es folgt das vollständige GetHiddenRowsOrCols-Codebeispiel in C# und 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;
}