2016-04-16 10 views
4

セルが日付であるかどうかはわかりません。OpenXML - Cell.DateTypeがnull

Date DataType Cell

私はそれは日の数だ場合、私は区別できないので、データ型がnullである気づきました。

私は細胞を抽出するために、次のコードを使用しています:

WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(worksheetId); 
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); 
Row[] rows = worksheetPart.Worksheet.Descendants<Row>().ToArray(); 
for (int i = 0; i < rows.Length; i++) 
{ 
    List<Cell> cells = rows[i].Elements<Cell>().ToList(); 
    foreach (var cell in cells) 
    { 
     if (cell.DataType != null && cell.DataType.Value == CellValues.Date) 
      //this line is not hit for some reason 
     } 
    } 
} 

私は何かが足りないのですか?

答えて

0

cell.HasValue insteedを試しましたか? intとDatetimeは常にNULL可能であるとは限らないため、コードの記述方法によって異なります。

4

要するに、数値型と日付型であるため、nullです。 msdn

DataTypeプロパティの値に

のOpenXMLドキュメントは、数値や日付タイプの場合はnullです。 文字列には値CellValues.SharedString、ブール値には CellValues.Booleanが含まれます。

しかしCellFormatNumberFormatIdを使用して、日付と番号のセルの書式を区別する方法があります。そのトリックは、idがどのような形式に対応しているのかを見極めることです。あなたは、新しいExcelファイルを作成することにより、どのような形式を使用すると、質問(すなわち日付)形式にセルを設定する見つけることができます。

enter image description here

その後7zipをを使用してファイルをエクセル抽出し、XL /のstyles.xml内部を見ますファイル:あなたがこののformatID 14は、短い日付に変換見ることができます上の画像で

enter image description here

。フォーマットの完全なリストについては、ECMA-376 documentation for Office Open XML formatsを参照してください(テーブルはパート4のどこかに埋もれているはずです)。

私は、最も一般的なformatIdsの列挙を作成しました:

private enum Formats 
    { 
     General = 0, 
     Number = 1, 
     Decimal = 2, 
     Currency = 164, 
     Accounting = 44, 
     DateShort = 14, 
     DateLong = 165, 
     Time = 166, 
     Percentage = 10, 
     Fraction = 12, 
     Scientific = 11, 
     Text = 49 
    } 

あなたはその後、あなたが希望の道をフォーマットされた値を取得するヘルパー関数を作成することができます。

private static string GetFormattedCellValue(WorkbookPart workbookPart, Cell cell) 
    { 
     if (cell == null) 
     { 
      return null; 
     } 

     string value = ""; 
     if (cell.DataType == null) // number & dates 
     { 
      int styleIndex = (int)cell.StyleIndex.Value; 
      CellFormat cellFormat = (CellFormat)workbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(styleIndex); 
      uint formatId = cellFormat.NumberFormatId.Value; 

      if (formatId == (uint)Formats.DateShort || formatId == (uint)Formats.DateLong) 
      { 
       double oaDate; 
       if (double.TryParse(cell.InnerText, out oaDate)) 
       { 
        value = DateTime.FromOADate(oaDate).ToShortDateString(); 
       } 
      } 
      else 
      { 
       value = cell.InnerText; 
      } 
     } 
     else // Shared string or boolean 
     { 
      switch (cell.DataType.Value) 
      { 
       case CellValues.SharedString: 
        SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(cell.CellValue.InnerText)); 
        value = ssi.Text.Text; 
        break; 
       case CellValues.Boolean: 
        value = cell.CellValue.InnerText == "0" ? "false" : "true"; 
        break; 
       default: 
        value = cell.CellValue.InnerText; 
        break; 
      } 
     } 

     return value; 
    } 
+0

うわー..完璧な意味@ goodies4uallを作る – thestar