2016-09-09 2 views
0

내 프로그램이 Excel 문서를 스캔하여 특정 셀의 값을 가져 와서 목록에 넣어야합니다.값이 숫자인지 또는 공유 문자열 테이블인지 OpenXML

그러나 스프레드 시트의 데이터는 모두 일반 형식으로되어 있으며 항상 SST에서 값을 조회합니다. 어쨌든 생각하고 목록의 스프레드 시트에 숫자 값을 넣지 않습니다.

내 프로그램에 데이터가 SST에 대한 참조가 아니라 번호임을 알리는 방법은 무엇입니까?

foreach (Cell cell in row.Elements<Cell>()) 
{ 
    try 
    { 
     cellvalue1 = cell.CellValue.InnerText; 
     if (cell.DataType == CellValues.SharedString && cellvalue2.Any(char.IsDigit)) 
     { 
      cellvalue2 = ssT.ElementAt(Int32.Parse(cellvalue1)).InnerText; 
     } 
     else 
     { 
      cellvalue2 = cell.CellValue.ToString(); 
     } 
    } 
    catch (Exception) 
    { 
     cellvalue2 = " "; 
    }          

    switch (cellvalue2) 
    { 
     case ("WELL NAME and NUMBER"): 
      WellnameCol = GetColumnName(cell.CellReference);                           
      break; 
     case ("FLOWING PRESSURE"): 
      FlowpCol = GetColumnName(cell.CellReference); 
      break; 
     case ("SHUT-IN PRESSURE"): 
      ShutpCol = GetColumnName(cell.CellReference); 
      break; 
     default: 
      if (GetColumnName(cell.CellReference) == WellnameCol) 
      { 
       if (cellvalue2.Contains("#")) 
       { 
        Wellname.Add(cellvalue2); 
        inRow = true; 
       } 
       else 
       { 
        inRow = false; 
       }                         
      }  
      else if (GetColumnName(cell.CellReference) == FlowpCol) 
      { 
       if (!cellvalue2.Contains("#") && inRow) 
        Flowp.Add(cellvalue2); 
      } 
      else if (GetColumnName(cell.CellReference) == ShutpCol) 
      { 
       if (inRow) 
       { 
        ShutP.Add(cellvalue2); 
       } 
      } 
      break;           
    }                  
} 

은 try 캐치 문은 셀이 비어인지 여부를 확인하는 것입니다 후 빈 문자열 그렇다면 같은 셀을 반환합니다.

모두에게 감사드립니다.

+0

을하지만 그것은 단지 작은 조각이다 내 코드는 각 셀을 통과하는 내부 루프입니다. –

+0

간단한 실수가있는 것처럼 보입니까? 변경 "cellvalue2 = cell.CellValue.ToString();" ~ "cellvalue2 = cell.CellValue.InnerText;" 또는 단순히 "cellvalue2 = cellvalue1"? CellValue는 System.Object에서 상속 된 ToString()을 재정의하지 않습니다. https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalue_methods(v=office.15).aspx. –

+0

@JackMiller 'cell.DataType == CellValues.SharedString'은'cell.DataType.Value == CellValues.SharedString'이어야합니다. – sly

답변

0

내가 셀 값 검색하는 데 사용되는 특정 코드입니다 : 당신이주의 참고 메신저 확인

public static string GetCellValue(SharedStringTable sharedStringTable, Cell cell) 
{ 
    string value = cell.CellValue.InnerText; 

    if (cell.DataType != null 
     && cell.DataType.Value == CellValues.SharedString) 
    { 
     return sharedStringTable.ChildElements[Int32.Parse(value)].InnerText; 
    } 
    else 
    { 
     return value; 
    } 
} 
+0

브릴리언트 감사합니다, 라인! 경우 (cell.DataType = null이 && 세포 .DataType.Value == CellValues.SharedString) 내가 필요한 것은 무엇인지, 나는 아직도 이해하지 못한다. 둘 다 일반 포맷으로 포맷되어 있다면 왜 스프레드 시트가 문자열로 저장되지 않는가? –

+0

Excel에서 @JackMiller'General' 서식은 실제로 자동 서식 지정입니다. Excel 문서의 [셀 서식 대화 상자에서 설정을 제어하고 이해하는 방법] 문서 (https://support.microsoft.com/en-us/)를 참조하십시오. kb/264372). 그러나 '텍스트'형식을 사용하는 경우 숫자는 공유 문자열 테이블에 저장해야합니다. – sly

0

"1234"라는 텍스트 문자열로 서식이 지정된 셀과 "abcd"라는 텍스트 콘텐츠가있는 두 번째 셀로 구성된 작은 Excel 파일을 만들었습니다.

xlsx 파일의 내용을 검사하여 xml 코드를 확인했습니다.

<c r="A1" s="1"><v>1234</v></c> 
<c r="A2" t="s"><v>0</v></c> 

t="s"은 공유 문자열을 나타냅니다. 첫 번째 경우에는 명시 적 데이터 유형 (t 속성)이 제공되지 않습니다. 이 차별화는이 MSDN 샘플에서도 사용됩니다. 이 도움이

 value = theCell.InnerText; 
     if (theCell.DataType != null) 
     { 
      switch (theCell.DataType.Value) 
      { 
       case CellValues.SharedString: 
        var stringTable = 
         wbPart.GetPartsOfType<SharedStringTablePart>() 
         .FirstOrDefault();       
        if (stringTable != null) 
        { 
         value = 
          stringTable.SharedStringTable 
          .ElementAt(int.Parse(value)).InnerText; 
        } 
        break; 
      } 
     } 

희망 : https://msdn.microsoft.com/de-de/library/office/hh298534.aspx는 여기에 귀하의 문제에 대한 흥미로운 부분이다. 나는 아래의 엑셀 스프레드 시트에서 데이터를 추출하기 위해 과거에 비슷한 짓을했는지

+0

스프레드 시트의 모든 숫자 값에 s = 3 "xml 파일 그게 무슨 뜻입니까? 86의 S 속성 ID로 스타일 정의를 정의 –

+0

3. –

관련 문제