〜 rubyなしでExcel操縦rubyスクリプトを実行 〜
当サイトは、exl18.zipに含まれている exl18.exe に関する解説です。
関連パッケージとして下のものもあるので、必要に応じてダウンロードして下さい。
2015年4月25日版 → 7月12日版の変更点は次のとおり。
なお、より旧いexl.exeについては rubyなしでExcel操縦rubyスクリプトを実行するためのexl.exeを参照して下さい。
Excelを自動操縦するため、exlap.rbというruby用ライブラリを作りましたが、当然ながらrubyがインストールされてないと使えません。
しかし、rubyのない環境で実行できると便利なケースがあります。そこで、exl18.exeを作りました。rubyがインストールされていない環境でも、exlap関連のサンプルを実行できます。
また、MS-Wordを自動操縦するためのwrdap関連のスクリプトも実行できます。
それから、exl18.exeは、ruby 1.8.7に依拠していますが、これとは別にexl21.exeというのもあります。こちらは ruby 2.1.5 に依拠しています。exl21.exeは、exl21.zipという別の圧縮ファイルに含まれています。
exl21の方はファイルサイズが大きいですが、より多くのrubyライブラリを組み込んであります。必要に応じて使い分けて下さい。使い方は同じです。
ちなみに、ruby 1.8.7 のサポートは既に終了しています。
パッケージ exl18.zip には、exl18.exe およびそのソースファイルなど関連ファイル一式が含まれています。
必要なのは exl18.exe だけです。他は必要に応じて参照して下さい。
exl18.exeは、exerb(rubyスクリプトを実行可能なexeファイルに変換するソフト)で作成したものです。exerb ver 5.4.0 で変換しました。
exl18.exeのファイルサイズは 1,830,912バイト(約1.7メガバイト)です。ちなみに、exl21.exeの方は約4.9メガバイトです。
exl18.exeを適当なディレクトリ(つまりフォルダ)にコピーします。それでインストールは終了です。
できれば、パスの通ったディレクトリにコピーしていただくと、後々便利ですが、そうしなければならないわけではありません。USBメモリーなどの外付媒体に置いておくのでもかまいません。
ちなみに、私は C:\usr\bin というディレクトリの下に exl18.exe を置いています。
《Windowsのマイコンピュータ(VISTA以降では「コンピュータ」)を動かし、スクリプトに焦点を当ててメニュー呼び出しを行う。》そんな方式でスクリプトを実行したい人は、とりあえずexl18.exeを実行して下さい。マイコンピュータでexl18.exeに焦点を当てて、それをクリックすれば exl18.exeを実行することになります。
こうすると、「送る」メニューに ExlRun18.bat というのが追加されます。この使い方については次項で述べます。
もう一度 exl18.exe を実行すると、「送る」メニューから ExlRun18.bat が削除されます。必要なくなった時に行って下さい。
あるいは、exl18.exeをUSBメモリーなどの外付媒体に置いている場合、その媒体をパソコンから取り外す時は、exl18.exeを実行して、「送る」メニューからExlRun18.batを削除して下さい。
マイコンピュータで test.rb(rubyスクリプト)に焦点を当てている状態で、「送る」メニューを呼び出すと、その中に「ExlRun18.bat」があると思います。それをクリックします。
すると、test.rb が ExlRun18.bat に送られます。これで test.rb が実行されることになります。
もし そのスクリプトが test.xls を生成するものであれば、test.xls が書き出されます。
スクリプトが標準出力もしくは標準エラー出力を出力した場合は、スクリプトがあるのと同じディレクトリに !stdout.txt もしくは !stderr.txt というテキストファイルが書き出されます。
スクリプトに誤りがあってエラーが発生した時は、!stderr.txt にそのエラーの内容が書き出されます。
WindowsのDOSプロンプトは、DOS窓とかコマンドプロンプトなどと言われることもあるようです。
「ファイル名を指定して実行」を選んでから、cmdの3文字を入力し、エンターキーをたたくと、DOSプロンプトの状態になります。
この状態で、例えば
C:\usr\bin\exl18.exe test.rb [enter]
のように入力すると、test.rbが実行されます。
exl18.exeがパスの通ったディレクトリに置かれていれば、
exl18.exe test.rb [enter]
のように、パス名を省略できます。先述の実行例にある C:\usr\bin\ を省略できます。
DOSプロンプトから抜け出すには
exit [enter]
と入力します。
exl18.exeに -x オプションを設けました。rubyの-xオプションと同じ意味合いのものです。
バッチファイルなどに書き込まれたスクリプトを取り出して実行します。スクリプトファイルを 読み込む時に、「#!」で始まり「ruby」という文字列を含む行までを 読み飛ばします。rubyは小文字です。
test.batなどのバッチファイルの中にrubyスクリプトを書き込んでおくと、test.batを実行することによって、バッチの中に書き込んであるそのrubyスクリプトを走らせることができます。
例えば、次のようなtest.batです。
−−−− ここから
@echo off
C:\usr\bin\exl18.exe -x "%~f0" %*
GOTO :EOF
#! ruby
Exlap.new("test.xls") do |wb|
ss = wb.fes
ss.Range("A1").Value = "test"
wb.save
end
−−−− ここまで
「C:\usr\bin\exl18.exe」は、実際のexl18.exeの所在に合わせて書き換えます。もしexl18.exeがバッチコマンドと同じディレクトリにあるのなら、「”%~dp0exl18.exe”」と書けば大丈夫です。
標準出力と標準エラー出力をファイルに書き出したい時は、次のようにします。
−−−− ここから
@echo off
C:\usr\bin\exl18.exe -x "%~f0" %* >!stdout.txt 2>!stderr.txt
FOR %%I IN (!std*.txt) DO IF %%~zI EQU 0 DEL %%I
GOTO :EOF
#! ruby
(中略)
exit
−−−− ここまで
上のようなバッチファイルの記述方法を覚えておくのは大変なので、-sampleオプションを指定してexl18.exeを実行すると、sample.batを出力します。例えば次のように実行します。
exl18.exe -sample F:\work [enter]
上のように実行すると、F:\work\sample.bat が書き出されます。
-sampleの代わりに-sでも大丈夫です。
なお、rubyスクリプトの先頭が「# make bat」という10文字からなる1行であれば、exl18.exeは、そのスクリプトを実行するのではなくバッチファイルを書き出します。
「# make bat>」の11文字が書いてあれば、やはりバッチファイルを書き出しますが、バッチファイル実行中の標準出力が !stdout.txt に、標準エラー出力が !stderr.txt に書き出されるようになります。
そのバッチファイルは、現在のパソコン環境だとどのディレクトリに持っていっても実行できます。
別のパソコンで使う場合、exl18.exeと同じディレクトリにあれば実行できます。
exl18.exeにパスが通っていれば、そのバッチファイルがどのディレクトリに置いてあっても実行可能です。
exl18.exeは、exerb ver 5.4.0(core: Ruby 1.8.7-p357)で作成しました。いわゆる32ビットコマンドですが、Windows7(64ビット版)でも使えます。
exl18.exeで実行するrubyスクリプトは、その漢字コードを Shift-JIS にして下さい。ruby v1.9 以降でいうと Windows-31J です。
requireされている主なrubyライブラリは次のとおり。詳細は exl18.exy 参照。
win32ole, Win32API, nkf, stringio, strscan, win32/open3,
csv, fileutils, tmpdir, tempfile, erb, time, uri, open-uri, pstore,
terminal-table(1.4.5), hpricot(0.8.6), pandoc-ruby(0.7.5),
exlap.rb(1.17), wrdap.rb(1.04), yado.rb(1.63), yados.rb,
rrxwin.rb(1.1), rrx.rb, pptap.rb
terminal-tableは、アスキー文字罫線の表を生成するためのライブラリです。
hpricotは、いわゆるhtmlパーサです。ちなみに、exl21.exeには、hpricotでなくnokogiriが組み込まれています。
上記以外のライブラリを必要とするスクリプトは、exl18.exeでは実行できません。
これらライブラリは、予めrequireされています。スクリプト中で改めてrequireする必要はありません。といっても、requireの記述を書いても支障はありません。
exl18.exeをDOSプロンプトで用いる場合は、スクリプトの後ろにコマンドライン引数を書くことができます。
exl18.exe test.rb book01.xls book02.xls [enter]
のように入力すると、test.rb の中で、ARGV[0] が “book01.xls” になり、ARGV[1] が “book02.xls” になります。
マイコンピュータ上で「送る」メニューを利用する時は、このコマンドライン引数の指定を行えません。
スクリプトにエラーがあった場合、その内容が !stderr.txt に書き出されますが、それを読む時に次のことを念頭に置いて下さい。
exl18.exeは、exl18.rbを実行ファイルに変換したものです。そのexl18.rbの277行目に「load(……)」という記述があります。
exl18.exeに引き渡されたスクリプト(test.rbなど)は、この load() で読み込まれて実行されます。そのため、エラーの出力は、例えば次のようになります。
−−−−
C:/usr/test.rb:15: syntax error, unexpected $end, expecting kEND
exl18.rb:277:in `load'
exl18.rb:277
−−−−
-xオプション指定時のexl18.exeの挙動
-xオプションでファイルが引き渡された場合、例えばtest.batというファイルが引き渡された場合は、それと同じ中身のテンポラリーファイルを設けます。ただし、「#! ruby」のような行が最初にみつかるまでを総てコメント行にします。行頭に「#」を挿入してコメント行にしてしまいます。それ以外は test.bat と同じです。
このテンポラリファイルを load() に渡して実行します。実行が終了すると、テンポラリファイルは削除されます。
「__END__, DATA」への対応
rubyスクリプト中に __END__ の7文字からなる行があり、それ以降にも何か書かれていると、その部分を DATA.read などと読み取って利用することがあります。
ただし、このようなスクリプトを load() で読み込み・実行しようとすると、うまくいきません。なぜうまくいかないかの理由についてはrubyのリファレンスなどを参照していただくとして、exl18.exeでは DATA を再設定することにより、読み込み・実行が意図どおりに行われるようにしてあります。
exlapのサンプルに「マクロの取扱い」というのがあり、そのサンプルでは「__END__, DATA」を多用していますが、それらも exl18.exe の下で実行可能です。
open3への対応
rubyでは、外部コマンドを実行する時に、その標準入力・標準出力・標準エラー出力を容易に扱えるようにするopen3という標準添付ライブラリがあります。
ただし、MS-Windows+ruby1.8の環境だとそのopen3が使えません。win32-open3を別途インストールする必要があります。
exl18.exeには、win32-open3 0.3.2が組み込まれています。そのため、下のようなスクリプトを実行できます。
−−−−−−−− ここから
Open3.popen3("sort") do |stdin, stdout, stderr|
stdin.write(" fox\n dog\n cat\n\x1a\n")
print stdout.read
STDERR.print stderr.read
end
−−−−−−−− ここまで
上のスクリプトは、sortコマンドを呼び出す例です。exl21.exeでも実行可能です。
pandoc-ruby(pandoc.exeを呼び出すためのライブラリ)の中でopen3を用いているので、exl18.exeにwin32-open3を組み込みました。
wrdap.rbは、MS-Wordを自動操縦するためのライブラリです。 私のサイトhttp://cup.sakura.ne.jp/wrdap.htmから関連のパッケージをダウンロードできます。
wrdap.rbにはpandoc.exeを利用するメソッドがいくつか組み込まれています。pandocは、markdownという記述ルールで書かれた原稿をワード文書(*.docx)に変換できるコマンドです。
exl18.exeでpandoc関連のメソッドを用いる時は、exl18.exeがあるのと同じディレクトリにpandoc.exeを置いて下さい。あるいは、pandoc.exeにパスが通っているのであれば、同じディレクトリに置かなくても大丈夫です。
pandocのダウンロードサイトは次のところです。
pandocに関する日本語解説は、下のサイトが参考になります。
yado.rb は、ADOという仕組みを利用して、Accessファイル(*.mdb, *.accdb)、Excelファイル(*.xls, *.xlsx)を扱うためのrubyライブラリです。
yados.rbの方は、 sqlite odbc driver がインストールされている場合に、sqlite3データベースを扱えるようにするためのものです。
yadoについては 私のサイトhttp://cup.sakura.ne.jp/yado.htm に ver 1.5 を掲載してますが、若干改善したものをexl18.exeに組み込みました。
使用例を一つあげてみます。Accessデータベースのサンプル Northwind.mdb がカレントディレクトリにある状態で、次の3行のスクリプトをexl18.exeの下で実行すると、Northwind.mdbの標準テーブルの内容をExcelファイルとして書き出すことができます。ただし、画像などのバイナリーデータは除かれます。
−−−− ここから
db = Yado.new("Northwind.mdb")
db.pav("Northwind.xls")
db.close
−−−− ここまで
もし Northwind.mdb の仮想テーブルの内容も一緒に書き出すのであれば、2行目を次のように書き換えます。
db.pav("Northwind.xls", %w(TABLE VIEW))
rrxwin.rbは、統計解析ソフトRをruby経由で利用するためのライブラリです。 私のサイトhttp://cup.sakura.ne.jp/rrx.htm から関連のパッケージをダウンロードできます。
rrxwin.rbには、統計解析ソフトRに関連するメソッドの他に、Windowsのクリップボード、Webページの取得などに関連するメソッドも組み込まれています。それらは、Rとは関係なく利用できます。
例えば、「Rrx::str2clp(“test”)」と書けば、クリップボードに test という文字を出力できます。一方、「str = Rrx::clp2str()」とすれば、クリップボードにある文字情報を変数strに代入できます。
Web上のデータを取得するための Rrx::get_web(), Excelのワークシートをrubyの配列に変換するための Rrx::xls2ary() などもあります。
それらメソッドについては、 rrxwin.rb で定義されている各種メソッド を参照して下さい。
ちなみに、rrx.rb というファイルも組み込まれていますが、これは、単に rrxwin.rb をrequireするだけのものです。
exl18.exeには exl18.rb, exlap.rb などが組み込まれているわけですが、簡単なrubyスクリプトを実行することで、それらを書き出すことができます。
例えば、exl18.rbを書き出すスクリプト get_src.rb は次のとおり。4行のスクリプトです。
−−−− get_src.rb ここから
filename = "exl18.rb"
src_fp = ExerbRuntime.open(filename)
body = src_fp.read
File.open(filename, "wb") {|ff| ff.write body}
−−−− get_src.rb ここまで
この get_src.rb を exl18.exe の下で実行すれば、exl18.rbが書き出されます。
このやり方は、exl21.exeに対しては用いることができません。
私のサイトに掲載しているexlap用のサンプルスクリプトは、exl18.exeの下で実行可能です。
wrdap用のサンプルスクリプトも同じく実行できます。
それらサンプルスクリプトと関連のドキュメントをexl_sample.zipという別の圧縮ファイルにしてWebにアップロードしておきます。
それらサンプルは、exl21.exeの下でも実行できます。
ただし、私が確認したところでは、ワードの箇条書きに関する list05b.rb をexl18.exeの下で実行するとエラーになります。exl21.exeでは大丈夫です。
これは、チェックマークを行頭文字とする箇条書きを行うものです。チェックマークをユニコード・ポイント記述形式 “\uF0FC” で表現しています。
これが ruby 1.8.7 では利用できないため、exl18.exeでは正しく扱えません。”\uF0FC” を [0xf0fc].pack(“U*”) と書けば、ruby 1.8.7 でも同じ文字を表現できるはずですが、このように書き換えてもうまくいきません。
exl21.exeでは、どちらの表現を用いてもエラーなく実行できます。
このようにエラーになってしまうものがありますが、ほとんどのサンプルスクリプトは exl18.exe でも実行できます。
〜 以上 〜