web-dev-qa-db-ja.com

EPPlusを使用してINTを返すExcelの日付列

そこで、EPPlusを使用してExcelドキュメントの読み取りと書き込みを行っています。

ワークフロー

  • ユーザーが作成された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が返ってくる

26
Tsukasa

...その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 
37
Tim Schmelter

一部の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.Formataccordinglyを設定することでした。

完全なコードサンプル(EPPlusを使用したDataTableからExcelファイル)を公開しました このブログのこの投稿

1
Darkseal