Excelシートから日時値を読み取る


89

Excelシートから日時型の値を読み取ろうとすると、double値が返されます。たとえば、'2007-02-19 14:11:45.730'このような値を読み取りたい場合は、double型の値を取得しています。さらに、タイムスパンを使用してこのdouble値を変換していますが、正常に完了しません。この値だけを取得しているので'2007-02-19 12:00:00 AM'
、最初の値とまったく同じ日時の値が必要です。私のコードは次のようなものです:-

TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);

  DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);

   arrrow2[cCnt - 1] = inputdate.ToString();

助けてください!!!ありがとう。

回答:


226

DateTime.FromOADateを使用して、日付形式をOLEオートメーションから.net形式に変換する必要があります。

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

1
また、回答に投票して正解としてマークしていただけませんか。
Mikael Svenson 2010

投票するには15の評判が必要ですが、私は新しいユーザーなので6つしかありませんが、答えを正解としてマークしました。
プラナフ2010

4
+1明らかに、賛成の制限は自分の質問には適用されるべきではありません。
Mike Rosenblum 2010

1
私は理解した。誰もがあなたに同意するわけではないことを指摘するだけで、この動作はバグです。
jwg 2013年

1
これは私が見つけた最も簡単な方法です。ありがとうございました。
アショク2017


6

Excelシートから日時値を読み取る:これでうまくいくようにしてください。

string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();

double date = double.Parse(sDate);

var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");

4
ちなみに、あなたのコードは受け入れられた答えとどのように異なりますか?
プラナフ2014

反対票を投じた。これは非効率的です。セルが日付の場合Value2、ボックス化されたdouble値を返します。
dbardakov

0

または、OleDbDataAdapterを使用してExcelからデータを取得することもできます


0

または、セルがすでに実際の日付である場合は、.Value2の代わりに.Valueを使用します。

excelApp.Range[namedRange].Value
{21/02/2013 00:00:00}
    Date: {21/02/2013 00:00:00}
    Day: 21
    DayOfWeek: Thursday
    DayOfYear: 52
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 634970016000000000
    TimeOfDay: {00:00:00}
    Year: 2013

excelApp.Range[namedRange].Value2
41326.0

1
それより少し複雑だと思います。Value戻りますDateTimeあなたが書いた場合DateTimeValueしかしdouble、あなたが書いた場合DateTimeValue2
jwg 2013年

0

私も同様の状況にあり、これを機能させるために以下のコードを使用しました。

Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);

Workbook workbook = new Workbook(fstream, loadOptions);

Worksheet worksheet = workbook.Worksheets[0];

dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);

DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();

foreach (DataColumn column in dtCloned.Columns)
{
    if (column.DataType == Type.GetType("System.DateTime"))
    {
        column.DataType = typeof(String);
        myAL.Add(column.ColumnName);
    }
}


foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}



foreach (string colName in myAL)
{
    dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
}


/*******************************/

public static class MyExtension
{
    public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
    {
        foreach (DataRow row in column.Table.Rows)
        {
            row[column] = conversion(row[column]);
        }
    }
}

これがsome1thx_joxinに役立つことを願っています


2
この回答を使用するには、ライセンスとそれに関連するAspose.Cells製品のインストールが必要です。これは素晴らしい製品ですが、すべての開発者がアクセスできるものではありません。
ザレフェス2014

0

エクセルシートからの日付値の読み取りに関連する別のスレッドに投稿した簡単な関数を試してみてください。

セルからテキストを入力として受け取り、DateTimeを出力として提供するだけです。

.Net開発コミュニティの利益のために提供されたサンプルコードの改善が見られれば幸いです。

スプレッドシートからExcelの日付を読み取っていないスレッドC#のリンクは次のとおりです


0

別のオプション:コンパイル時にセルタイプが不明で、日付Range.Valueが目的のDateTimeオブジェクトを返すようにセルがフォーマットされている場合。


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.