2010-04-12 7 views
14

Open XML SDK 2.0을 사용하여 Excel 2007 통합 문서의 단일 워크 시트에서 데이터를 읽어야합니다. 이 작업을 수행하는 데 필요한 기본 지침을 검색하는 데 많은 시간을 할애했지만 스프레드 시트를 만드는 데 도움을 얻었습니다.OpenXML 형식 SDK를 사용하여 스프레드 시트에서 데이터를 읽으려면 어떻게해야합니까?

워크 시트의 행을 반복 한 다음이 SDK를 사용하여 각 행의 셀을 반복하는 방법은 무엇입니까?

+0

@Otaku, 나는 조사 할 기회가 없었지만, 당신이 준 링크를 훑어 보면 그들이 매우 가치 있고 아마도 내 질문에 답할 가능성이 높습니다. 감사. – ProfK

+0

아직 조사 할 기회가 있었습니까? 내가 더 이상 도움이 될 수 있다면 알려줘. –

+0

예, @ 오타쿠, 고마워요. "LINQ 사용"기사는 행과 셀을 반복하는 것을 제외하고는 아무 일도하지 않지만 시트에 액세스하는 방법 만 보여줍니다. – ProfK

답변

11

내가하는 방법은 Linq입니다. SDK를 사용하여 순수한 Open XML (SDK 없음)로만이 주제에 관한 샘플이 많이 있습니다. 아마 (

  • Reading Data from SpreadsheetML

  • +0

    안녕하세요, 토드, 저 좀 도와주세요. 나는 다음과 같은 문제가있다 : http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell 미리 감사드립니다 - Nate –

    +0

    @NatePet, 이것에 대해 미안, 나는 전부가 아니다. Excel에 익숙한 분이라면 대답을 찾기에는 너무 오래 걸릴 것입니다. –

    27

    다른 답변은 메타 답변과 비슷하게 보입니다. LINQ를 사용하면 분리 된 문서 부분을 사용할 수 있으므로이 작업에 어려움을 겪고 있습니다. 다음 코드에는 가능한 문자열 조회를 해결하는 셀에서 값을 가져 오는 래퍼 함수가 포함되어 있습니다.

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

    편집 : 감사 @Nitin-Jadhav GetCellValue에 대한 보정().

    +0

    안녕하세요, 저를 도울 수 있습니까? http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell에 문제가 있습니다. –

    +0

    매우 유용합니다. 감사. –

    +0

    정말 좋은 예입니다. 정말로 효과가 있습니다. 감사합니다! – berliner

    관련 문제