2012-01-11 1 views
12

Sheet1, Sheet2 및 Sheet3이라는 세 개의 워크 시트가있는 Excel 2010 스프레드 시트가 있습니다.XML SDK 2.0을 열고 Excel 워크 시트의 이름을 액세스 할 수 있습니다.

이름으로 워크 시트에 대한 참조를 얻으려고합니다. 나는 시트 2에 대한 참조를 얻기 위해 노력하고

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>(); 
} 

, 그러나 나는이 작업을 수행 할 수있는 방법을 찾을 수 없습니다 :

나는 코드를 사용하고 있습니다.

나는 더 가까워지고 있어요,하지만 난 아직 아니에요 : 나에게 시트에 대한 참조를 가져옵니다

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

아니라 시트의 데이터에

감사

답변

21

당신이 정말로 원하는 것은 WorksheetPart이며 당신이 찾고있는 SheetData을 포함하고 있습니다. SheetsWorkbook 아래에두면 워크 시트에 대한 특정 메타 데이터 만 제공됩니다. 여기 WorksheetPart이 (필자는 sheetName 이미 First하지 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); 
} 

그럼 그냥 잡아 위의 코드를 사용 올바른 SheetData 참조를 사용하면 거기에서 원하는 데이터를 찾을 수 있습니다.

+0

감사합니다. amurra !! –

3

특정 탭 또는 시트 이름이있는 스프레드 시트를 처리하고 CSV와 같은 것으로 덤프하는 코드가 있습니다. (나는 쉼표 대신에 파이프를 선택했다.)

셀에서 값을 얻는 것이 더 쉬웠 으면 좋겠지 만, 이것이 우리가 붙어있는 것입니다. 이 코드의 대부분을 얻은 MSDN 문서를 참조 할 수 있습니다. 이것이 바로 Microsoft가 권장하는 것입니다.

/// <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; 
    } 
관련 문제