【问题标题】:How to count rows per worksheet in OpenXML如何在 OpenXML 中计算每个工作表的行数
【发布时间】:2015-03-06 10:21:15
【问题描述】:

我从Interop 库切换到OpenXML,因为我需要读取大型Excel 文件。在此之前我可以使用:

worksheet.UsedRange.Rows.Count

获取工作表上包含数据的行数。我用这些信息制作了一个进度条。在 OpenXML 中,我不知道如何获得有关工作表的相同信息。我现在拥有的是这段代码:

 using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false))
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
    int row_count = 0, col_count;
    // here I would like to get the info about the number of rows
    foreach (Row r in sheetData.Elements<Row>())
    {
        col_count = 0;
        if (row_count > 10)
        {
            foreach (Cell c in r.Elements<Cell>())
            {
                // do some stuff  
                // update progressbar  
            }
        }
        row_count++;
    }
}

【问题讨论】:

    标签: c# openxml


    【解决方案1】:

    没那么难(当你使用LINQ),

     using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open("PATH", true))
     {
       //Get workbookpart
       WorkbookPart workbookPart = myDoc.WorkbookPart;
    
       //then access to the worksheet part
       IEnumerable<WorksheetPart> worksheetPart = workbookPart.WorksheetParts;
    
       foreach (WorksheetPart WSP in worksheetPart)
       {
          //find sheet data
          IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();       
          // Iterate through every sheet inside Excel sheet
          foreach (SheetData SD in sheetData)
          {
               IEnumerable<Row> row = SD.Elements<Row>(); // Get the row IEnumerator
               Console.WriteLine(row.Count()); // Will give you the count of rows
          }
    }
    

    使用Linq 编辑,现在很简单。

    【讨论】:

    • 所以,我必须事先做这个循环?只是为了计算行数?我问这个,因为我在处理数据的主循环中更新进度条,但在此之前我必须设置它的最大属性(即工作表上的行数)
    • 抱歉发布的太匆忙了...试试最新的更新 :) 使用 LINQ
    • 对于您的答案.. 不,您不需要:) 我的答案提供了工作表中所有工作表的可用行数.. 只需使用提供的代码 :)
    • 好的。我现在明白了。我会在我的代码中检查一下这个方法。
    • 你的代码和我的唯一区别是我遍历了所有的工作表:) 它可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多