[ruby + excel] SaveAsでの注意点


rubyではwin32oleを使えばエクセルを操作することができます。
SaveAsのところでエラーが出てしまったので、注意点をメモします。
method_missing: (in OLE method 'saveas')(WIN32OLERuntimeError)みたいなエラーでした。

結論

指定したディレクトリに保存する場合
- 絶対パスにする。
- パスの区切りは/ではなく\にする。

require 'win32ole'

app = WIN32OLE.new('Excel.Application')
book = app.workbooks.add
out_path = File.expand_path('test.xlsx').gsub('/', '\\')
book.saveas filename: out_path
book.close savechanges: false
app.quit

SaveAsで指定するパスについて

  1. 相対パスではエクセルが持っているローカルが基準になります。
  2. パスの区切り文字は/ではなく\にしてあげます。
  3. 名前付き引数はシンボルで指定してあげます。

1. エクセルが持っているカレント

rubyでは相対パスが利用できます。
エクセルでも相対パスが使えますが、「カレント」が指す場所はエクセルで設定されているローカルフォルダになります。
オプションの「規定のローカル ファイルの保存場所」に書かれている場所です。
なので、rubyが実行している場所をカレントとするために絶対パスにしてあげます。

out_path = File.expand_path('test.xlsx')

2. パスの区切りは/ではなく\で。

rubyのパスでは、階層の区切りに/(スラッシュ)が使われます。
どうやらこのままでは保存できなかったので区切り文字を(バックスラッシュ)に置き換えます。

out_path = File.expand_path('test.xlsx').gsub('/', '\\')

3. 名前付き引数の指定

名前付き引数はシンボルで指定できます。
VBAでは「:=」を使いますが、下記のように書きます。

workbook.saveas filename: path

なぜできるのかは未検証です。引数をハッシュで渡しているから?

余談

rubyの基本のようですが、

p out_path

では文字列が""で囲まれ、\が\\とエスケープされて表示されます。
(\\じゃなくて、一つにしたい!と、いろいろやって数時間。。)
あくまでもプロンプトの表示の問題で、実際には\はひとつです。

puts out_path

とすればよかったのでした。

ruby初心者のため、間違った記述があるかもしれません。
コメント等でご指摘いただければ幸いです。