2017-09-18 2 views
0

Excel을 구문 분석하고 C# 및 openxml을 사용하여 데이터 테이블에 결과를 얻으려고합니다. 다음은 제 코드입니다. OpenXML로 구문 분석하는 동안 잘못된 셀 값 가져 오기

value = cell.CellValue.InnerText; 
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) 
     { 
      return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText; 
     } 
     return value; 

그러나 셀 값은 다음 80.3600 인 경우는 80.36로 분석지고

. 또한 값이 03-1 월 -2018이면 으로 구문 분석됩니다. 문제는 Excel에서 구문 분석하려고하는 Excel이 동적으로 생성되고 런타임에 어떤 열이 날짜인지, 어떤 열이 숫자인지를 알 수 없습니다. 그대로 값을 가져 오거나 모든 값을 문자열 (즉, 서식이 지정되지 않음)로 가져 오는 방법이 있습니까?

답변

0

나는 숫자와 날짜 시간 셀의 값이 서로 다른 styleIndex 값을 가졌음을 알았습니다. doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats에서 styleIndex로 셀 서식을 가져올 수 있습니다.

 var doc = SpreadsheetDocument.Open(File.Open("D:\\123.xlsx", FileMode.Open), false); 
     var sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(); 
     WorksheetPart wsPart = (WorksheetPart)(doc.WorkbookPart.GetPartById(sheet.Id)); 
     var cells = wsPart.Worksheet.Descendants<Cell>().ToList(); 


     var numberingFormats = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ToList(); 

     var stringTable = doc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); 
     foreach (var cell in cells) 
     { 
      if (cell.DataType == null) 
      { 
       //DateTime 
       if (cell.StyleIndex != null) 
       { 
        var numerFormat = numberingFormats.ElementAt((int) cell.StyleIndex.Value - 1) as NumberingFormat; 
        if (numerFormat.FormatCode.Value == "[$-409]mmmm\\ d\\,\\ yyyy;@") 
        { 
         Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("MMMM dd,yyyy")); 
        } 
        else if (numerFormat.FormatCode.Value == "[$-409]dd\\-mmm\\-yy;@") 
        { 
         Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("dd-MMM-yy")); 
        } 
       } 
       else 
       { 
        //Numeric 
        Console.WriteLine(int.Parse(cell.InnerText)); 
       } 

      } 
      else if (cell.DataType.Value == CellValues.SharedString) 
      { 
       Console.WriteLine(stringTable.SharedStringTable.ElementAt(int.Parse(cell.InnerText)).InnerText); 
      } 
     } 

이 하나를 읽을 수 있습니다 Excel Interop cell formatting of Dates