(おまけ) Excel DNA for F# の日付の注意点2

日付に関して別の問題が発覚!

ExcelDNAで日付を入力したセルに対しての読み取り方法

  1. 「yyyy/MM/dd」の形式のデータDouble型のシリアル値になる。
  2. 「yyyyMMdd」の形式のデータはDouble型の数値になる。

シリアル値の変換は以下のコードを利用
(おまけ) F#でExcelの日付データのシリアル値をDateTime型に変換する。


Double型の「yyyyMMdd」は文字列にしてDateTime.TryParseすれば簡単に変換できる。
Double型の「yyyyMMdd」は文字列にして"/"を挿入して DateTime.TryParse すれか、TryParseに書式指定できたと思われるので、書式指定アリで変換する。



これらを踏まえた関数を用意すると非常に便利である。
※カルチャ(ロケール?)がja-JPであることが大前提のコードとなります。

//■テストコード
> (tranDate "20001231").Value.ToShortDateString();;
val it : string = "2000/12/31"
> (tranDate 20001231.).Value.ToShortDateString();;
val it : string = "2000/12/31"
> (tranDate 36891.).Value.ToShortDateString();;
val it : string = "2000/12/31"
//■ソースコード
open System

/// Excel日付の規定値
let excelBaseDate = DateTime.Parse("1899/12/31")

/// DateTimeに変換する。
let tranDate (value:obj) =
    let text = Convert.ToString(value)
    if String.IsNullOrEmpty text then None
    else
        let text = if text.Length = 8 then text.Insert(6, "/").Insert(4, "/") else text
        let (b,dt) = DateTime.TryParse text
        if b then Some dt
        elif value.GetType() = typeof<Double> then
            let x = value :?> Double
            let x = if x < 59. then x else x - 1.
            Some <| excelBaseDate.AddDays x
        else None
    • -