スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門 他のアプリとの連携編 その3 Excel(3)

今回はエクセルからの値の読み込みを紹介します。
 
前回と同様でコードの最初で次のようになっているものとします。
 
#if INTERACTIVE
#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"
#endif
 
open Microsoft.Office.Interop.Excel
 
let app = new ApplicationClass(Visible = true)
 
let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet)
let worksheet = workbook.Worksheets.[1] :?> Worksheet
 
このworksheet のC5に3が入っているものとします。
 
これを読みだすには次のようにします。
 
> let rv = (worksheet.Cells.Item(3,5) :?> Range).Value2;;
val rv : obj = 3.0
 
なにも入っていない場所をしていするとnullが返ります。
 
> let rv = (worksheet.Cells.Item(2,5) :?> Range).Value2;;
val rv : obj = null
 
それでは読み込みを関数化しておきます。
 
> let get (ws:Worksheet) (row : int) (col :int) =
    (ws.Cells.Item(row,col) :?> Range).Value2;;
 
val get : Worksheet -> int -> int -> obj
 
使ってみます。
> get worksheet 3 5;;
val it : obj = 3.0
 
読み込んだ値のキャストも含めて関数を定義してみます。
 
> let getFloat (ws:Worksheet) (row : int) (col :int) =
    (get ws row col) :?> float
 
let getInt (ws:Worksheet) (row : int) (col :int) =
    (get ws row col) :?> int
 
let getString (ws:Worksheet) (row : int) (col :int) =
    (get ws row col) :?> string;;
 
val getFloat : Worksheet -> int -> int -> float
val getInt : Worksheet -> int -> int -> int
val getString : Worksheet -> int -> int -> string
 
> getFloat worksheet 3 5;;
val it : float = 3.0
 
ただし違った型でキャストしようとすると例外が発生します。
 
> getInt worksheet 3 5;;
System.InvalidCastException: Specified cast is not valid.
   at <StartupCode$FSI_0011>.$FSI_0011.main@()
Stopped due to error
 
ジェネティクな関数として定義すると次のようになります。
 
> let getG<'a> (ws:Worksheet) (row : int) (col :int) =
    (get ws row col) :?> 'a;;
 
val getG : Worksheet -> int -> int -> 'a
 
> getG<float> worksheet 3 5;;
val it : float = 3.0
 
それでは範囲指定をして、その範囲の値をArray2Dに入れて返す関数を定義してみます。
 
> let getGA1<'a> (ws:Worksheet) (sR,sC) (eR,eC) =
    Array2D.init (eR - sR + 1) (eC - sC + 1) (fun r c -> getG<'a> ws (sR+r) (sC+c));;
 
val getGA1 : Worksheet -> int * int -> int * int -> 'a [,]
 
エクセルが次のような状態になっているとします。 
 

703-1.jpg 
 
(実行例)
> getGA1<float> worksheet (1,1) (2,4);;
val it : float [,] = [[4.0; 7.0; 9.0; 12.0]
                      [7.0; 3.0; 5.0; 7.0]]
                      
 
取り込む範囲を左上と右下のアドレスで指定できる関数も定義してみます。
 
let getGA2<'a> (ws:Worksheet) (sA:string) (eA:string) =
     getGA1<'a> ws (nToRC sA) (nToRC eA)
 
なおnToRCは前々回に定義した関数です。
 
(実行例)
> getGA2<float> worksheet "A1" "D2";;
val it : float [,] = [[4.0; 7.0; 9.0; 12.0]
                      [7.0; 3.0; 5.0; 7.0]]
                      
 
最後に取り込む範囲を左上のアドレスと、行数、列数で指定する関数を定義してみます。
 
> let getGA3<'a> (ws:Worksheet) (sA:string) rc cc =
    let (sR,sC) = nToRC sA
    getGA1<'a> ws (sR,sC) (sR+rc-1,sC+cc-1);;
 
val getGA3 : Worksheet -> string -> int -> int -> 'a [,]
 
(実行例)
> getGA3<float> worksheet "A1" 2 4;;
val it : float [,] = [[4.0; 7.0; 9.0; 12.0]
                      [7.0; 3.0; 5.0; 7.0]]
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。