win32oleを使ってexcelからデータを取得する

excelからデータを取得する処理を書いてみました
参考サイト

http://jp.rubyist.net/magazine/?0004-Win32OLE


win32oleを使う場合の注意事項
windowsじゃないと動かない
・win32oleへの引数はsjis

ソース↓


$kcode='sjis'

require 'win32ole'
require 'kconv'

#==============================================
# Excel
# excelデータの取得を行う
#==============================================
class Excel

def initialize(file_path)
@file_name = absolute_path(file_path)
end

# cellのデータを取得する
def cell_value(sheet_name,range)
open_sheet(sheet_name) do |sheet|
nil_check(sheet.Range(range.tosjis).value)
end
end

# excelで編集を行った範囲のデータを取得する、戻り値は行と列の2次元配列
def used_range_values(sheet_name)
ret_arr = []
open_sheet(sheet_name) do |sheet|
sheet.usedrange.rows.each do |row|
a = []
row.columns.each do |cell|
a << nil_check(cell.value)
end
ret_arr << a
end
end
return ret_arr
end

def open_sheet(sheet_name)
begin
xl = WIN32OLE.new('Excel.Application')
book = xl.Workbooks.open(@file_name)
sheet = book.worksheets.item(sheet_name.tosjis)
yield(sheet)
rescue WIN32OLERuntimeError => e
e.to_str
ensure
book.Close
xl.Quit
end
end

def open_book
begin
xl = WIN32OLE.new('Excel.Application')
book = xl.Workbooks.open(@filename)
yield(book)
rescue WIN32OLERuntimeError => e
e.to_str
ensure
book.Close
xl.Quit
end
end

# -- private ----------------------------------------- #
private
def absolute_path(filename)
fso = WIN32OLE.new('Scripting.FileSystemObject')
return fso.GetAbsolutePathName(filename)
end

def nil_check(value)
if value.nil?
"" # blank
else
value.to_s.toutf8
end
end

end

e = Excel.new("excel/test.xls")
puts e.cell_value("てすと","B2")
p e.used_range_values("てすと")