2012-01-11 11 views
12

Mam arkusz kalkulacyjny Excel 2010, który ma 3 arkusze robocze o nazwach Arkusz1, Arkusz2 i Arkusz3.Otwórz pakiet XML SDK 2.0, aby uzyskać dostęp do arkusza Excel 2010 o nazwie

Próbuję uzyskać odniesienie do arkusza roboczego po nazwie.

używam kod:

using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(FileName, true)) 
{ 
    //Access the main Workbook part, which contains all references 
    WorkbookPart workbookPart = myWorkbook.WorkbookPart; 

    WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last(); 

    // this gives me Sheet1 
    SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); 
} 

Próbuję uzyskać odniesienie do Arkusz2, ale nie mogę znaleźć sposób, aby to zrobić.

jestem coraz bliżej, ale nie jestem tam jeszcze:

var x = workbookPart.Workbook.Sheets.Where(s=> s.GetAttribute("name", "").Value == "Sheet2").FirstOrDefault(); 

że dostaje mi odniesienie do arkusza, ale nie do danych na arkuszu

Dzięki

Odpowiedz

21

To, czego naprawdę chcesz, to WorksheetPart, czyli to, co zawiera SheetData, którego szukasz. Pobranie Sheets pod Workbook da ci tylko określone metadane dotyczące arkuszy. Oto przykład, jak chwycić że WorksheetPart (krępuj się dodać sprawdzanie błędów, jak widać pasuje jak zakładam sheetName istnieje już nazywając First i nie FirstOrDefault)

public WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName) 
{ 
    string relId = workbookPart.Workbook.Descendants<Sheet>().First(s => sheetName.Equals(s.Name)).Id; 
    return (WorksheetPart)workbookPart.GetPartById(relId); 
} 

Następnie wystarczy użyć kodu powyżej, aby pobrać poprawne odniesienie do SheetData, a będziesz mógł znaleźć tam dane, które chcesz.

+0

Dzięki amurra !! –

3

Oto kod do przetwarzania arkusza kalkulacyjnego z określoną nazwą karty lub arkusza i zrzucania go do pliku CSV. (Wybrałem rurę zamiast przecinka).

Chciałbym, aby łatwiej było uzyskać wartość z komórki, ale myślę, że to jest to, z czym jesteśmy skazani. Widać, że odwołuję się do dokumentów MSDN, w których mam większość tego kodu. Właśnie to Microsoft zaleca.

/// <summary> 
    /// Got code from: https://msdn.microsoft.com/en-us/library/office/gg575571.aspx 
    /// </summary> 
    [Test] 
    public void WriteOutExcelFile() 
    { 
     var fileName = "ExcelFiles\\File_With_Many_Tabs.xlsx"; 
     var sheetName = "Submission Form"; // Existing tab name. 
     using (var document = SpreadsheetDocument.Open(fileName, isEditable: false)) 
     { 
      var workbookPart = document.WorkbookPart; 
      var sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName); 
      var worksheetPart = (WorksheetPart)(workbookPart.GetPartById(sheet.Id)); 
      var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 

      foreach (var row in sheetData.Elements<Row>()) 
      { 
       foreach (var cell in row.Elements<Cell>()) 
       { 
        Console.Write("|" + GetCellValue(cell, workbookPart)); 
       } 
       Console.Write("\n"); 
      } 
     } 
    } 

    /// <summary> 
    /// Got code from: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx 
    /// </summary> 
    /// <param name="cell"></param> 
    /// <param name="workbookPart"></param> 
    /// <returns></returns> 
    private string GetCellValue(Cell cell, WorkbookPart workbookPart) 
    { 
     if (cell == null) 
     { 
      return null; 
     } 

     var value = cell.CellFormula != null 
      ? cell.CellValue.InnerText 
      : cell.InnerText.Trim(); 

     // If the cell represents an integer number, you are done. 
     // For dates, this code returns the serialized value that 
     // represents the date. The code handles strings and 
     // Booleans individually. For shared strings, the code 
     // looks up the corresponding value in the shared string 
     // table. For Booleans, the code converts the value into 
     // the words TRUE or FALSE. 
     if (cell.DataType == null) 
     { 
      return value; 
     } 
     switch (cell.DataType.Value) 
     { 
      case CellValues.SharedString: 

       // For shared strings, look up the value in the 
       // shared strings table. 
       var stringTable = 
        workbookPart.GetPartsOfType<SharedStringTablePart>() 
         .FirstOrDefault(); 

       // If the shared string table is missing, something 
       // is wrong. Return the index that is in 
       // the cell. Otherwise, look up the correct text in 
       // the table. 
       if (stringTable != null) 
       { 
        value = 
         stringTable.SharedStringTable 
          .ElementAt(int.Parse(value)).InnerText; 
       } 
       break; 

      case CellValues.Boolean: 
       switch (value) 
       { 
        case "0": 
         value = "FALSE"; 
         break; 
        default: 
         value = "TRUE"; 
         break; 
       } 
       break; 
     } 
     return value; 
    }