Freigeben über


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. Sie enthält eine Beispielmethode GetHiddenRowsOrCols zur Veranschaulichung dieser Aufgabe.


GetHiddenRowsOrCols-Methode

Sie können die GetHiddenRowsOrCols -Methode verwenden, um eine Liste der ausgeblendeten Zeilen oder Spalten in einem Arbeitsblatt abzurufen. 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 <DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open*> -Methode und gibt an, dass das Dokument für schreibgeschützten Zugriff geöffnet sein soll (der endgültige false Parameterwert). Als Nächstes ruft der Code mithilfe der -Eigenschaft des Dokuments einen Verweis auf den WorkbookPart Arbeitsmappenteil ab.

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 -Eigenschaft des Arbeitsmappenteils durchsuchen und die Name -Eigenschaft jedes gefundenen Blatts Workbook 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 Id die 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);

Die blattinformationen, die Sie bereits abgerufen haben, 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 Parameter, den detectRows 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 eigenschaften bereitstellt MinMax , 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 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

Im Folgenden finden Sie das vollständige GetHiddenRowsOrCols Codebeispiel in C# und 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;
}

Siehe auch