2015-03-06 11 views
6

Przełączyłem się z biblioteki Interop na OpenXML, ponieważ muszę czytać duże pliki Excel. Wcześniej mogłem użyć:Jak liczyć wiersze na arkusz w OpenXML

worksheet.UsedRange.Rows.Count 

, aby uzyskać liczbę wierszy z danymi w arkuszu. Użyłem tych informacji, aby zrobić pasek postępu. W OpenXML nie wiem, jak uzyskać te same informacje o arkuszu. Co mam teraz jest ten kod:

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++; 
    } 
} 

Odpowiedz

8

To nie jest takie trudne (Podczas korzystania 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 
     } 
} 

Zmieniano z Linq teraz to proste.

+0

Więc, musiałem wcześniej zrobić tę pętlę? Wystarczy zliczyć wiersze? Pytam o to, ponieważ w głównej pętli, w której przetwarzam dane, aktualizuję pasek postępu, ale wcześniej musiałem ustawić jego maksymalną właściwość (która jest liczbą rzędów w arkuszu). – Jacobian

+0

Przepraszam, że w pośpiechu ... spróbuj newsest update :) Używa LINQ –

+0

Dla twojej odpowiedzi ... nie, nie będziesz potrzebować :) Moja odpowiedź zawiera liczbę wierszy dostępnych dla wszystkich arkuszy w arkuszu roboczym .. po prostu wykorzystaj dostarczony kod :) –

Powiązane problemy