2010-04-12 12 views
14

Potrzebuję odczytać dane z jednego arkusza roboczego w skoroszycie programu Excel 2007 przy użyciu Open XML SDK 2.0. Spędziłem dużo czasu szukając podstawowych wskazówek, aby to zrobić, ale znalazłem tylko pomoc w tworzeniu arkuszy kalkulacyjnych.Jak odczytać dane z arkusza kalkulacyjnego przy użyciu zestawu SDK formatu OpenXML?

W jaki sposób Ierować wiersze w arkuszu, a następnie iterować komórki w każdym wierszu za pomocą tego zestawu SDK?

+0

@Otaku, nie miałem okazji zbadać, ale szybkie spojrzenie na linki, które podałeś sugeruje, że będą one dość cenne i najprawdopodobniej odpowiedzą na moje pytanie. Dzięki. – ProfK

+0

Czy zdążyłeś już to sprawdzić? Daj mi znać, jeśli mogę uzyskać dalszą pomoc. –

+0

Tak, @Otaku, dzięki. Artykuł "Korzystanie z LINQ" był bardzo przydatny, chociaż nie robię nic, co robi, oprócz iterowania wierszy i komórek, ale pokazuje, jak uzyskać dostęp do arkusza. – ProfK

Odpowiedz

11

Sposób w jaki to robię jest z Linq. Istnieje wiele przykładów na temat tego, jak używać SDK do korzystania z czystego Open XML (bez SDK). Spójrz na:

+0

Hej Todd, możesz mi pomóc. Mam problem z następującymi: http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell Z góry dziękuję - Nate –

+0

@NatePet, przepraszam za to, nie jestem wszystkim znajomy z Excelem, więc prawdopodobnie zajęłoby mi to zbyt dużo czasu, aby znaleźć dla ciebie odpowiedź. –

27

Inna odpowiedź wydawała się bardziej jak meta-odpowiedź. Miałem z tym problemy, ponieważ używanie LINQ działa z oddzielnymi częściami dokumentu. Poniższy kod zawiera funkcję opakowania, która pobiera wartość z komórki, rozwiązując wszelkie możliwe wyszukiwania ciągów.

public void ExcelDocTest() 
{ 
    Debug.WriteLine("Running through sheet."); 
    int rowsComplete = 0; 

    using (SpreadsheetDocument spreadsheetDocument = 
        SpreadsheetDocument.Open(@"path\to\Spreadsheet.xlsx", false)) 
    { 
     WorkbookPart workBookPart = spreadsheetDocument.WorkbookPart; 

     foreach (Sheet s in workBookPart.Workbook.Descendants<Sheet>()) 
     { 
      WorksheetPart wsPart = workBookPart.GetPartById(s.Id) as WorksheetPart; 
      Debug.WriteLine("Worksheet {1}:{2} - id({0}) {3}", s.Id, s.SheetId, s.Name, 
       wsPart == null ? "NOT FOUND!" : "found."); 

      if (wsPart == null) 
      { 
       continue; 
      } 

      Row[] rows = wsPart.Worksheet.Descendants<Row>().ToArray(); 

      //assumes the first row contains column names 
      foreach (Row row in wsPart.Worksheet.Descendants<Row>()) 
      { 
       rowsComplete++; 

       bool emptyRow = true; 
       List<object> rowData = new List<object>(); 
       string value; 

       foreach (Cell c in row.Elements<Cell>()) 
       { 
        value = GetCellValue(c); 
        emptyRow = emptyRow && string.IsNullOrWhiteSpace(value); 
        rowData.Add(value); 
       } 

       Debug.WriteLine("Row {0}: {1}", row, 
        emptyRow ? "EMPTY!" : string.Join(", ", rowData)); 
      } 
     } 

    } 
    Debug.WriteLine("Done, processed {0} rows.", rowsComplete); 
} 

public static string GetCellValue(Cell cell) 
{ 
    if (cell == null) 
     return null; 
    if (cell.DataType == null) 
     return cell.InnerText; 

    string value = cell.InnerText; 
    switch (cell.DataType.Value) 
    { 
     case CellValues.SharedString: 
      // For shared strings, look up the value in the shared strings table. 
      // Get worksheet from cell 
      OpenXmlElement parent = cell.Parent; 
      while (parent.Parent != null && parent.Parent != parent 
        && string.Compare(parent.LocalName, "worksheet", true) != 0) 
      { 
       parent = parent.Parent; 
      } 
      if (string.Compare(parent.LocalName, "worksheet", true) != 0) 
      { 
       throw new Exception("Unable to find parent worksheet."); 
      } 

      Worksheet ws = parent as Worksheet; 
      SpreadsheetDocument ssDoc = ws.WorksheetPart.OpenXmlPackage as SpreadsheetDocument; 
      SharedStringTablePart sstPart = ssDoc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); 

      // lookup value in shared string table 
      if (sstPart != null && sstPart.SharedStringTable != null) 
      { 
       value = sstPart.SharedStringTable.ElementAt(int.Parse(value)).InnerText; 
      } 
      break; 

     //this case within a case is copied from msdn. 
     case CellValues.Boolean: 
      switch (value) 
      { 
       case "0": 
        value = "FALSE"; 
        break; 
       default: 
        value = "TRUE"; 
        break; 
      } 
      break; 
    } 
    return value; 
} 

Edit: Dzięki @Nitin-Jadhav do korekty do GetCellValue().

+0

Witam, możesz mi pomóc. Mam problem z http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell –

+0

Bardzo przydatne. Dzięki. –

+0

Bardzo dobry przykład, który naprawdę działa, dzięki! – berliner