要するに、数値型と日付型であるため、nullです。 msdn
DataTypeプロパティの値に
のOpenXMLドキュメントは、数値や日付タイプの場合はnullです。 文字列には値CellValues.SharedString、ブール値には CellValues.Booleanが含まれます。
しかしCellFormat上NumberFormatIdを使用して、日付と番号のセルの書式を区別する方法があります。そのトリックは、idがどのような形式に対応しているのかを見極めることです。あなたは、新しいExcelファイルを作成することにより、どのような形式を使用すると、質問(すなわち日付)形式にセルを設定する見つけることができます。
その後7zipをを使用してファイルをエクセル抽出し、XL /のstyles.xml内部を見ますファイル:あなたがこののformatID 14は、短い日付に変換見ることができます上の画像で
。フォーマットの完全なリストについては、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;
}
うわー..完璧な意味@ goodies4uallを作る – thestar