2010-04-12 5 views
14

Je dois lire les données d'une seule feuille de calcul dans un classeur Excel 2007 à l'aide de Open XML SDK 2.0. J'ai passé beaucoup de temps à chercher des directives de base pour ce faire, mais j'ai seulement trouvé de l'aide pour créer des feuilles de calcul.Comment lire des données à partir d'une feuille de calcul à l'aide du SDK OpenXML Format?

Comment puis-je itérer des lignes dans une feuille de calcul, puis itérer les cellules de chaque ligne à l'aide de ce SDK?

+0

@Otaku, je n'ai pas eu l'occasion d'enquêter, mais un rapide coup d'œil sur les liens que vous avez donnés suggère qu'ils seront très utiles et répondront probablement à ma question. Merci. – ProfK

+0

Avez-vous déjà eu l'occasion d'enquêter là-dessus? Faites-moi savoir si je peux vous aider. –

+0

Oui, @Otaku, merci. L'article "Utilisation de LINQ" a été très utile, bien que je ne fasse rien sauf répéter des lignes et des cellules, mais cela montre juste comment accéder à une feuille. – ProfK

Répondre

11

La façon dont je fais cela est avec Linq. Il y a beaucoup d'exemples sur ce sujet, allant du SDK au simple Open XML (sans SDK). Jetez un oeil à:

+0

Hey Todd, pouvez-vous m'aider. J'ai un problème avec ce qui suit: http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell Merci d'avance - Nate –

+0

@NatePet, désolé à ce sujet, je ne suis pas tout que familier avec Excel, donc il me faudrait probablement trop de temps pour trouver une réponse pour vous. –

27

L'autre réponse semblait plus comme une méta-réponse. J'ai lutté avec cela puisque l'utilisation de LINQ fonctionne avec des parties de document séparées. Le code suivant inclut une fonction wrapper pour obtenir la valeur d'une cellule, résolvant toutes les recherches de chaîne possibles.

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: Merci @Nitin-Jadhav pour la correction à GetCellValue().

+0

Salut, pouvez-vous m'aider. J'ai un problème avec http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell –

+0

Très utile. Merci. –

+0

Très bon exemple, qui fonctionne vraiment, merci! – berliner

Questions connexes