xlsファイルを読む
暫定版
require 'win32ole' class OpenCalc def initialize @document = nil begin @manager = WIN32OLE.new("com.sun.star.ServiceManager") @desktop = @manager.createInstance("com.sun.star.frame.Desktop") rescue puts "OpenOfficeがインストールされていない?" @document = nil end end def open( filename, visible = false, &block) # 特定のファイル名の場合,新規で開く? # @document = @desktop.loadComponentFromURL("private:factory/scalc", "_blank", # 0, _opts({"Hidden" => !visible})) # 新しいメソッド blankとかのほうがいいかも? url = "file:///" + get_absolute_path( filename).gsub( "\\", "/"); @document = @desktop.loadComponentFromURL( url, "_blank", 0, _opts({"Hidden" => !visible})) if block sheets( &block) close end @document end def sheet( n) if n.kind_of? String @document.Sheets.getByName( n ) else @document.Sheets.getByIndex( n ) end end def sheets() @document.Sheets.Count.times {|i| yield @document.Sheets.getByIndex(i) } end def close() @document.close(false) if @document @document = nil end def quit close() @desktop.close() if @desktop @manager.Quit if @manager @desktop = nil @manager = nil end def _opts(hash) hash.inject(opts = []) {|x,y| opt = @manager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") opt["Name"] = y[0] opt["Value"] = y[1] x << opt } end end # 相対パスを絶対パスに変換する def get_absolute_path( filename) fso = WIN32OLE.new('Scripting.FileSystemObject') fso.GetAbsolutePathName(filename) end def get_used_range( sheet) range = sheet.createCursor() range.gotoStartOfUsedArea(false) range.gotoEndOfUsedArea(true) range end # sheet.get_used_range()のほうがいい? #=============================================== calc = OpenCalc.new calc.open("test.xls") {|sheet| range = get_used_range( sheet) range.Rows.Count.times {|row| record = [] range.Columns.Count.times {|column| record << range.getCellByPosition( column, row).getString } p record } } calc.quit
この程度なら,エクセルやOpenOfficeのCalcでcsv化して,csvを読んだほうが楽だよな.
ドキュメントの探し方が悪いのか操作方法がよく分からない.ネットで検索してVBでの使い方とかから類推して弄ってみた.
仕様は暫定であとで変更する.
エクセルがあるなら,るびまの方がお勧め.