スポンサーサイト

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

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

今回はグラフ化に挑戦してみたいと思います。
 
以下のコードをF#Interactiveに食わせている状態から説明を加えます。
 
#if INTERACTIVE
#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"
#endif
 
open Microsoft.Office.Interop.Excel 
  
let set (ws:Worksheet) (row:int) (col:int) v =
    ws.Cells.Item(row,col) <- v
 
let setH (ws:Worksheet) (sRow:int) (sCol:int) (vSeq :seq<'a>) =
    vSeq 
    |> Seq.mapi (fun i v -> (sRow,sCol + i ,v)) 
    |> Seq.iter (fun (r,c,v) -> set ws r c v)
 
let setV (ws:Worksheet) (sRow:int) (sCol:int) (vSeq :seq<'a>) =
    vSeq 
    |> Seq.mapi (fun i v -> (sRow+i,sCol,v)) 
    |> Seq.iter (fun (r,c,v) -> set ws r c v) 
  
let app = new ApplicationClass(Visible = true)
 
let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet)
let worksheet = workbook.Worksheets.[1] :?> Worksheet
 
setH worksheet 2 2 ["year";"2008";"2009";"2010"]
setH worksheet 3 3 [1234.0; 1240.0; 1100.0]
setH worksheet 4 3 [605.0; 580.0; 550.0]
setH worksheet 5 3 [991.0; 1050.0; 1009.0]
setH worksheet 6 3 [777.0; 508.0; 603.0]
setH worksheet 7 3 [888.0; 896.0; 810.0]
setV worksheet 3 2 ["東京";"長野";"大阪";"京都";"千葉"] 
 
704-1.jpg 
 
まずチャートオブジェツを定義します。
 
let chartobjs = (worksheet.ChartObjects() :?> ChartObjects)
 
追加するチャートの位置大きさをまずは次のように定義しておきます。
 
let (g_xPos,g_yPos,g_width,g_height) = (300.0,20.0,300.0,200.0)
 
チャートオブジェクトを定義します。
 
let chartobj = chartobjs.Add(g_xPos,g_yPos,g_width,g_height)
 
次のようにChartWizardメソッドを実行するとグラフが表示されます。
 
chartobj.Chart.ChartWizard
    (Title = "サンプル",
     Source = worksheet.Range("B2","E7"),
     Gallery = XlChartType.xl3DColumn,
     PlotBy = XlRowCol.xlColumns,
     SeriesLabels = 1,
     CategoryLabels = 1,
     CategoryTitle = "",
     ValueTitle = "sample") 
      
 
 704-2.jpg


> chartobj.Chart.ChartStyle <- 1;;
val it : unit = ()
 
> chartobj.Chart.ChartStyle <- 2;;
val it : unit = ()
.....
としていくと、順次グラフの色が変わっていきます。
 
> chartobj.Delete() |> ignore;;
val it : unit = ()
 
とするとグラフが消えます。
 
次にChartWizardメソッドの引数であるGalleryを少し調べてみたいと思います。
これは内部的にenum型なので、GetNamesメソッドで、すべての名前を得ることができます。
 
> XlChartType.GetValues (typeof<Microsoft.Office.Interop.Excel.XlChartType>);;
val it : System.Array =
  [|xlArea; xlLine; xlPie; xlBubble; xlColumnClustered; xlColumnStacked;
    xlColumnStacked100; xl3DColumnClustered; xl3DColumnStacked;
    xl3DColumnStacked100; xlBarClustered; xlBarStacked; xlBarStacked100;
    xl3DBarClustered; xl3DBarStacked; xl3DBarStacked100; xlLineStacked;
    xlLineStacked100; xlLineMarkers; xlLineMarkersStacked;
    xlLineMarkersStacked100; xlPieOfPie; xlPieExploded; xl3DPieExploded;
    xlBarOfPie; xlXYScatterSmooth; xlXYScatterSmoothNoMarkers;
    xlXYScatterLines; xlXYScatterLinesNoMarkers; xlAreaStacked;
    xlAreaStacked100; xl3DAreaStacked; xl3DAreaStacked100; xlDoughnutExploded;
    xlRadarMarkers; xlRadarFilled; xlSurface; xlSurfaceWireframe;
    xlSurfaceTopView; xlSurfaceTopViewWireframe; xlBubble3DEffect; xlStockHLC;
    xlStockOHLC; xlStockVHLC; xlStockVOHLC; xlCylinderColClustered;
    xlCylinderColStacked; xlCylinderColStacked100; xlCylinderBarClustered;
    xlCylinderBarStacked; xlCylinderBarStacked100; xlCylinderCol;
    xlConeColClustered; xlConeColStacked; xlConeColStacked100;
    xlConeBarClustered; xlConeBarStacked; xlConeBarStacked100; xlConeCol;
    xlPyramidColClustered; xlPyramidColStacked; xlPyramidColStacked100;
    xlPyramidBarClustered; xlPyramidBarStacked; xlPyramidBarStacked100;
    xlPyramidCol; xlXYScatter; xlRadar; xlDoughnut; xl3DPie; xl3DLine;
    xl3DColumn; xl3DArea|]

 
垂直方向の位置とGalleryの値(XlChartType型)とタイトルを与えるとグラフを表示する関数を定義してみます。
 
let drawG (yPos:float ,gall:XlChartType,title:string)=
    let chartobj = chartobjs.Add(g_xPos,yPos,g_width,g_height)
    try    
        chartobj.Chart.ChartWizard
            (Title = title,
             Source = worksheet.Range("B2","E7"),
             Gallery = gall,
             PlotBy = XlRowCol.xlColumns,
             SeriesLabels = 1,
             CategoryLabels = 1,
             CategoryTitle = "",
             ValueTitle = "sample")
    with
       | ex -> printfn "type = %A  mes = %A " (ex.GetType ()) ex.Message 
       
なお、表示範囲の設定がGalleryの値に対しては無効な場合があり、その場合例外が投げられるので、Try withを使っています。
 
それでは、ここまでを全部まとめて、表示可能なグラフを全部表示するコードを示します。
 
#if INTERACTIVE
#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"
#endif
 
open Microsoft.Office.Interop.Excel
 
 
let set (ws:Worksheet) (row:int) (col:int) v =
    ws.Cells.Item(row,col) <- v
 
let setH (ws:Worksheet) (sRow:int) (sCol:int) (vSeq :seq<'a>) =
    vSeq 
    |> Seq.mapi (fun i v -> (sRow,sCol + i ,v)) 
    |> Seq.iter (fun (r,c,v) -> set ws r c v)
 
let setV (ws:Worksheet) (sRow:int) (sCol:int) (vSeq :seq<'a>) =
    vSeq 
    |> Seq.mapi (fun i v -> (sRow+i,sCol,v)) 
    |> Seq.iter (fun (r,c,v) -> set ws r c v)
 
 
let app = new ApplicationClass(Visible = true)
 
let workbook = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet)
let worksheet = workbook.Worksheets.[1] :?> Worksheet
 
setH worksheet 2 2 ["year";"2008";"2009";"2010"]
setH worksheet 3 3 [1234.0; 1240.0; 1100.0]
setH worksheet 4 3 [605.0; 580.0; 550.0]
setH worksheet 5 3 [991.0; 1050.0; 1009.0]
setH worksheet 6 3 [777.0; 508.0; 603.0]
setH worksheet 7 3 [888.0; 896.0; 810.0]
setV worksheet 3 2 ["東京";"長野";"大阪";"京都";"千葉"]
 
let chartobjs = (worksheet.ChartObjects() :?> ChartObjects)
let (g_xPos,g_yPos,g_width,g_height) = (300.0,20.0,300.0,200.0)
 
let drawG (yPos:float ,gall:XlChartType,title:string)=
    let chartobj = chartobjs.Add(g_xPos,yPos,g_width,g_height)
    try    
        chartobj.Chart.ChartWizard
            (Title = title,
             Source = worksheet.Range("B2","E7"),
             Gallery = gall,
             PlotBy = XlRowCol.xlColumns,
             SeriesLabels = 1,
             CategoryLabels = 1,
             CategoryTitle = "",
             ValueTitle = "sample")
 
    with
       | ex -> printfn "type = %A  mes = %A " title ex.Message 
 
let cTypes =XlChartType.GetValues (typeof<Microsoft.Office.Interop.Excel.XlChartType>)
let cTypesWithIndex = Array.mapi(fun i v -> (i,v))  (cTypes :?> XlChartType []) 
 
cTypesWithIndex 
|> Array.map(fun (i,v) -> (g_yPos+(float i)*(g_height+10.0),v,v.ToString()))
|> Array.map (fun x -> drawG x)
|> ignore
 
これをF#Interactiveに送ると、次のように表示されます。
 
(表示(一部のみ)) 
 
704-3.jpg  

(表示できないグラフの部分は空箱が表示されます。)
 
> chartobjs.Delete() |> ignore;;
val it : unit = ()
 
とすればグラフが全部消えます。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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