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での使い方とかから類推して弄ってみた.

仕様は暫定であとで変更する.

エクセルがあるなら,るびまの方がお勧め.