2017-09-18 25 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-Jan-2018の場合、と解析されています。 問題は、私が解析しようとしているExcelが動的に生成され、実行時に、どの列が日付であり、どの列が数値であるかわからないということです。 そのまま値を取得する方法や、すべての値を文字列として取得する方法はありますか?

答えて

0

私は、数値と日付の時間のセルの値が異なるstyleIndex値を持っていることに気付きました。 doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormatsからstyleIndexでセルフォーマットを取得できます。 Excel Interop cell formatting of Dates

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

もこれを読むことができます

関連する問題