(おまけ) Excel DNA for F# の日付の注意点2
日付に関して別の問題が発覚!
ExcelDNAで日付を入力したセルに対しての読み取り方法
- 「yyyy/MM/dd」の形式のデータDouble型のシリアル値になる。
- 「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
-
- -