Ruby の invoke メソッドだけで Excel にアクセスする。

C で Excel にアクセスするのには COM の invoke を使ってアクセスします。C で書く前に Rubyinvoke メソッドだけを使ってアクセスしてみます。
参考:Win32OLE 活用法 【第 2 回】 Excel
COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続

require 'win32ole'

# セルを取得
def cellObject(sheet, y, x)
   sheet.invoke("Cells").invoke("Item",y,x)
end

# マージセルなら1,1のアイテム、通常セルならそのセル
# を返す。
def getItem(cell)
   if cell.invoke("MergeCells")
      then cell.invoke("MergeArea").invoke("Item",1,1)
      else cell end
end

# セルデータを取得
def getCell(sheet, y, x)
   getItem(cellObject(sheet, y, x)).invoke("Value")
end


# セルにデータを書き込み
def putCell(sheet,y,x,value)
   getItem(cellObject(sheet, y, x)).setproperty("Value",value)
end


filename = WIN32OLE.new('Scripting.FileSystemObject').invoke("GetAbsolutePathName","sample2.xls")
xl = WIN32OLE.new('Excel.Application')
# xl.setproperty("Visible",true)

book  = xl.invoke("Workbooks").invoke("Open",filename)
sheet = book.invoke("Worksheets",2)

putCell(sheet, 1, 2, "Haskell")
putCell(sheet, 1, 3, "Scala")
putCell(sheet, 1, 4, "Prolog")

p getCell(sheet, 1,2)
p getCell(sheet, 1,3)
p getCell(sheet, 1,4)
book.invoke("Save")

xl.invoke("Workbooks").invoke("Close")
xl.invoke("Quit")
PS D:\lang\COM\Excel> ruby exl.rb
"Haskell"
"Scala"
"Prolog"