簡體   English   中英

如何使用 DocumentFormat.OpenXml 總是跳過指定的行數

[英]How to always skip specified number of Rows using DocumentFormat.OpenXml

我使用 DocumentFormat.OpenXml 遍歷行,有時我需要從第 4、8、11 行開始。 我用下面的“skipRows”和“If”定義了應該跳過多少行,讓我跳過不必要的行:

var rows = sheet.Descendants<Row>();
foreach (Row row in rows)
{
    if (dataRowIndex < skipRows)
    {
         dataRowIndex++;
         continue;
    }

問題是,有時當行完全為空時,它不會自動遍歷它。 有時,當它為空時,它會遍歷它。 當在所述行中寫入任何單元格時,它總是迭代。 這是為什么? 無論這些行中的單元格中是否有任何數據,我如何確保它始終跳過例如 6 行?

有時,當它為空時,它會遍歷它。 當在所述行中寫入任何單元格時,它總是迭代。 這是為什么?

這是由於 XML 模式的定義方式造成的。 模式中的行是完全可選的; 如果一行中沒有數據,則不需要將其寫入 XML(盡管也沒有什么可以阻止它被寫入)。 如果一行中有一個單元格,則該行必須寫入 XML,因為單元格是一行的子項; 如果沒有該行,將無處可寫單元格。

無論這些行中的單元格中是否有任何數據,我如何確保它始終跳過例如 6 行?

您可以使用RowRowIndex屬性找出正在讀取的Row的實際索引。

下面的例子應該做你所追求的:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    SharedStringTablePart stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

    var rows = sheetData.Descendants<Row>();

    foreach (Row row in rows)
    {
        if (row.RowIndex <= skipRows)
        {
            continue;
        }

        //this is just to show that it's outputting from the first non-skipped row
        Cell cell = row.GetFirstChild<Cell>();
        string contents;

        if (cell.DataType == CellValues.SharedString)
        {
            int index = int.Parse(cell.CellValue.InnerText);
            contents = stringTable.SharedStringTable.ElementAt(index).InnerText;
        }
        else
        {
            contents = cell.InnerText;
        }
        Console.WriteLine(contents);
    }
}

暫無
暫無

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

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