そこで、EPPlusを使用してExcelドキュメントの読み取りと書き込みを行っています。
ワークフロー
EPPlusを使用してドキュメントを作成したときに生成された日付は、値を読み込んでいるときに正しく表示されますが、ユーザーが日付を変更したり追加した行は、実際の日付として使用できるものではなくINT値として表示されます。
日付を入力すると1/01/2014と書き、ファイルを開いたときの出力に4164と表示されます
次のように読んでいます
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value != null
? sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value.ToString().Trim()
: string.Empty
更新
ファイルをエクスポートするときに、以下を追加しました
DateTime testDate;
if (DateTime.TryParse(split[i], out testDate))
{
sheet.Cells[row, i + 1].Style.Numberformat.Format = "MM/dd/yyyy";
sheet.Cells[row, i + 1].Value = testDate.ToString("MM/dd/yyyy");
}
また、値を読み返すときに私は試しました
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Style.Numberformat.Format = "MM/dd/yyy";
まだINTが返ってくる
...そのExcelファイルを読み取る必要がある場合、誤っている日付はユーザーが変更した日付のみです
変更されたExcelシートを読み取ると、変更された日付は数値ですが、変更されていない値は日付形式の文字列ですか?
DateTime.FromOADate
経由でDateTime
を取得できます:
long dateNum = long.Parse(worksheet.Cells[row, column].Value.ToString());
DateTime result = DateTime.FromOADate(dateNum);
あなたのサンプル番号で:
Console.Write(DateTime.FromOADate(41640)); // -> 01/01/2014
一部のASP.NET DataTablesからExcelドキュメントを生成しようとしたときに、今日この問題に遭遇しました。文字列には問題がありませんでしたが、数値型(int、double、decimals)および文字列としてフォーマットされたDataTablesにいくつかの問題が発生しましたまたは数値表現(OADate)として。
これが私が最終的に成功させたソリューションです:
if (dc.DataType == typeof(DateTime))
{
if (!r.IsNull(dc))
{
ws.SetValue(row, col, (DateTime)r[dc]);
// Change the following line if you need a different DateTime format
var dtFormat = "dd/MM/yyyy";
ws.Cells[row, col].Style.Numberformat.Format = dtFormat;
}
else ws.SetValue(row, col, null);
}
どうやら、トリックは値をDateTime
に設定し、適切なStyle.Numberformat.Format
accordinglyを設定することでした。
完全なコードサンプル(EPPlusを使用したDataTableからExcelファイル)を公開しました このブログのこの投稿 。