2012-01-18 5 views
3

OpenXML을 사용하여 스프레드 시트를 열고 스프레드 시트의 행을 반복합니다. 행 내의 모든 셀을 반환하는 linq 쿼리가 있습니다. linq 쿼리는 MSDN의 데모에서 곧바로 리핑되었습니다.OpenXML linq query

IEnumerable<String> textValues = 
    from cell in row.Descendants<Cell>() 
    where cell.CellValue != null 
    select (cell.DataType != null 
      && cell.DataType.HasValue 
      && cell.DataType == CellValues.SharedString 
      ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText 
      : cell.CellValue.InnerText); 

LINQ 쿼리는 값, 이 모든 셀을 반환에 큰이지만 값이없는 세포를 반환하지 않습니다. 이것은 차례로 어느 셀이 어떤 것인지 알 수 없게 만듭니다. 좀 더 설명해 드리겠습니다. 예를 들어 스프레드 시트에 이름, SSN 및 주소라는 세 개의 열이 있다고 가정 해보십시오. 이 linq 쿼리가 작동하는 방식은 주어진 행에 대한 값을 가진 셀만 반환한다는 것입니다. 그래서 "John", "", "173 Sycamore"가있는 데이터 행이 있다면 linq 쿼리는 "John"과 "173 Sycamore"를 열거 형으로 반환하므로 열거 형에서 if "173 Sycamore"는 SSN 또는 주소 필드입니다.

여기 다시 말씀 드리겠습니다. 내가 필요한 것은 모든 셀이 반환되고 값이 인 셀뿐 아니라 반환해야합니다.

내가 생각할 수있는 모든면에서 원숭이에게 linq 쿼리를 시도했지만 아무런 운이 없었습니다 (즉, where 절을 제거하는 것이 트릭이 아닙니다). 어떤 도움을 주시면 감사하겠습니다. 감사!

답변

4

OpenXML 표준은 데이터가없는 셀의 자리 표시자를 정의하지 않습니다. 즉, XML의 기본 저장소는 드문 드문 있습니다. 다음 "왼쪽"에 row.Descendants<Cell>() 컬렉션에 가입 (아마 작업의 CROSS JOIN 형식을 사용하여)

  1. 모두 "가능"또는 "수"세포의 목록을 만들기 : 당신은 두 가지 방법 중 하나를이 라운드 일할 수 셀 참조에 값이 있는지 확인하십시오.
  2. ClosedXML 또는 EPPlus과 같은 타사 도구를 Excel 데이터를 래퍼로 사용하고 개발자에게 친숙한 인터페이스를 쿼리하십시오. ClosedXML와
+0

나는 Excel 스프레드 시트를 내보내는 데 ClosedXML을 사용했지만 전혀 가져 오지 않았다고 생각했습니다. 그거야? 나는 심지어 오늘 빠른 그들의 웹 사이트에서 오늘 빠르게 보였다. 그리고 그것이했다라고하는 것을 알지 않았다 (그것은 정말로 빠른 모양이었다). EPPlus를 살펴 보겠습니다. 실제로, OpenXML로 무엇인가를하려고 할 때마다 나는 겉으로는 단순해야만하는 것이 무엇이든 끝내야한다는 것에 놀라곤합니다! – Jagd

+0

가져 오기를 통해 데이터를 읽고 쓰는 기능을 의미하는 경우 OpenXML과 EPPlus가 모두이를 수행 할 수 있습니다. OpenXML을 직접적으로 사용하려고 시도하는 것은 위대한 고통이지만 SDK의 일부인 문서 탐색기와 위 도구와 같은 도구를 사용하면 이전 COM Interop보다 훨씬 좋은 soooooo를 처리해야한다는 데 동의합니다. – jklemmack

+1

ClosedXML은 훌륭하게 작동했습니다. OpenXML을 사용하는 대신 처음부터 사용했으면 좋겠습니다. 다시 한 번 감사드립니다! – Jagd

3

:

var wb = new XLWorkbook("YourWorkbook.xlsx"); 
var ws = wb.Worksheet("YourWorksheetName"); 
var range = ws.RangeUsed(); 
foreach(var row in range.Rows()) 
{ 
    // Do something with the row... 
    // ... 

    foreach(var cell in row.Cells()) 
    { 
     // Now do something with every cell in the row 
     // ... 
    } 
} 
+0

굉장! 나는 그것을 조사 할 것이다! – Jagd

+0

아, 그렇게 많은 노력이 거의 코드에 집중되지 않았습니다. 감사 –

0

내가 추천 한 방법은 그들이 당신의 LINQ 문에 의해 반환 될 수 있도록 빈 데이터를 모두 널 세포를 입력하는 것입니다. 이를 수행하는 방법은 answer을 참조하십시오.