2009年8月15日土曜日

RubyでExcel操作

win32oleを利用するとRubyやPython、JavaなどからOfficeなどのWindowsアプリケーションが操作できます。ExcelをRubyから使いたいと思い、いろいろやってみました。なかなかまとまった資料が見つからないのですが、下記のURLにはかなりお世話になりました。後は手探りですね(^^;

Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ
VBA より便利で手軽 Excel 操作スクリプト言語「Ruby」へのお誘い
Ruby による Win32OLE プログラミング
Ruby on Windows

それからExcel関連の定数表は

Microsoft Excel Constants [Excel 2003 VBA Language Reference]

また実際にExcelで操作をマクロに記録し、そのマクロを見てみると下記のようになっています。

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2009/8/15 ユーザー名 :
'
Selection.TickLabels.AutoScaleFont = True
With Selection.TickLabels.Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 11.25
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 3
.Background = xlOpaque
End With
End Sub


これはExcelでチャートの座標軸を設定したりした結果のVBAスクリプトなのですが、ここからなんやかんや推定して、やってみました。ファイルを読み込んで、その5列目、6列目のデータをx、y座標値として散布図を描いたものです。VBAの赤字がRubyでは下記の赤字になるようですね。どこを大文字にしてどこが小文字かなどがまだいまいち完全に理解できていません。

require 'win32ole'

class ExcelConst
end

# Start up Excel
excel = WIN32OLE.new('Excel.Application')
#load the excel constants
WIN32OLE.const_load(excel, ExcelConst)

excel.visible = false

# Open a file
book = excel.Workbooks.Open(File::expand_path(file)
#ワークシートの指定
sheetInput = book.Worksheets(1)
#グラフ領域の指定
graphInput = sheetInput.ChartObjects.Add(380,50,500,500)
#チャートの生成
chartInput = graphInput.Chart
#散布図の指定
chartInput['ChartType'] = ExcelConst::XlXYScatter #with XlXYScatter's x capitalized

chartInput.HasLegend = false

#Chartのデータの設定
chartInput.SetSourceData(sheetInput.Range('E1:F'+inputData.length.to_s))

#Chartのタイトルの設定
chartInput.HasTitle = true
chartInput.ChartTitle.Characters.Text = 'ABC'
chartInput.ChartTitle.Font.Name = 'Verdana'
chartInput.ChartTitle.Font.Size = 16
chartInput.ChartTitle.Font.Bold = true
chartInput.ChartTitle.Font.ColorIndex = 5 # Blue

#Chartの軸の設定
chartInput.Axes(ExcelConst::XlValue).tickLabels.font['Background'] = ExcelConst::XlOpaque
chartInput.Axes(ExcelConst::XlValue).tickLabels.font['ColorIndex'] = 3 # red
chartInput.Axes(ExcelConst::XlCategory).minimumScale = (xmin/100).floor*100 #このXLCategoryがx軸のようだ
chartInput.Axes(ExcelConst::XlCategory).maximumScale = (xmax/100).ceil*100
chartInput.Axes(ExcelConst::XlValue).minimumScale = (ymin/100).floor*100 #このXLValueがy軸のようだ
chartInput.Axes(ExcelConst::XlValue).maximumScale = (ymax/100).ceil*100
excel.visible = true

0 件のコメント: