簡體   English   中英

如何使用 OpenXML 僅在 Excel 電子表格中獲取可見單元格?

[英]How can I only get visible cells in an Excel spreadsheet using OpenXML?

我正在使用 C# 中的 OpenXML 從 Excel 電子表格中的單元格中提取數據。 如果單元格在電子表格上可見,我只想提取數據。 我可以使用以下代碼獲取所有單元格:

var cells = part.Worksheet.Descendants<Cell>;

然后我可以使用“CellReference.Value”屬性來確定單元格屬於哪一列。

下面的代碼將為我提供電子表格上的可見列。

var visible_columns = part.Worksheet.Descendants<Column>().Where(a => a.Hidden == null || a.Hidden.Value == false);

我現在被困在試圖以編程方式將單元格 object 與其列 object 關聯起來。 據我所知,object 列上沒有屬性來獲取它的名稱。 理想情況下,我會使用正則表達式從單元格 object 上的“CellReference.Value”屬性中獲取列名。 一旦有了它,我就可以使用它來獲取關聯的列 object,然后我可以使用它來檢查 Hidden 屬性。

我還查看了單元格 object 的“父”屬性,但這給了我一個行 object 並不能解決我的問題。 誰能指出我正確的方向?

謝謝

以下是讀取不在隱藏行或列內的單元格的方法:

static void Main()
{
    using (var spreadsheetDocument = SpreadsheetDocument.Open("input.xlsx", false))
    {
        var workbookPart = spreadsheetDocument.WorkbookPart;
        var worksheetPart = workbookPart.WorksheetParts.First();
        var worksheet = worksheetPart.Worksheet;

        var columns = worksheet.Elements<Columns>().First();

        // Get names of the hidden columns.
        var hiddenColumnNames = new HashSet<string>();
        foreach (var column in columns.Elements<Column>().Where(c=> c.Hidden != null && c.Hidden.Value))
            for (uint min = column.Min, max = column.Max; min <= max; min++)
                hiddenColumnNames.Add(GetColumnName(min));

        var sheetData = worksheet.Elements<SheetData>().First();
        foreach (var row in sheetData.Elements<Row>())
        {
            // Skip cells that are in hidden row.
            if (row.Hidden != null && row.Hidden.Value)
                continue;

            foreach (var cell in row.Elements<Cell>())
            {
                // Skip cell that is in hidden column.
                var columnName = cell.CellReference.Value.Replace(row.RowIndex.ToString(), "");
                if (hiddenColumnNames.Contains(columnName))
                    continue;

                // TODO: read visible cell ...
            }
        }
    }
}

static string GetColumnName(uint columnNumber)
{
    string columnName = "";

    while (columnNumber > 0)
    {
        uint modulo = (columnNumber - 1) % 26;
        columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
        columnNumber = (uint)((columnNumber - modulo) / 26);
    }

    return columnName;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM