OpenOffice.orgとRubyを使ってWordファイルをバッチ処理する
RubyとCOM
WordやExcel*1はCOM(Component Object Model)を通して外部から操作することができます。
- ファイルを開く
- 文字列を置換する
- 印刷する
- 保存する
- 別名で保存する
- 形式を変更して保存する
これらの操作を組み合わせてフォーマットの一括変換や定型文書の差し込み処理を行うことができます。
RubyにはWin32OLEライブラリが付属していてCOMオブジェクトを操作することができます。RubyからWord・Excelを操作する場合、通常はMicrosoft OfficeのCOMを呼び出すことになります。
つまりRubyでWord・Excelをバッチ処理したいマシンにはMicrosoft Officeがインストールされている必要があります。しかし、ここでMicrosoft Officeと互換性のあるOpenOffice.orgのCOMを使うことができます。
OpenOffice.orgのCOMを使うことのメリットはMicrosoft Officeのライセンスを用意しなくてもWordやらExcelのバッチ処理用マシンを作れる点にあります。デメリットは互換性の低さで、保存する形式によっては罫線が崩れたりすることがあります。
サンプルプログラム
d:\document1.doc にHello World!と書いたWordファイルを置いて下記のスクリプトを実行するとGoodBy World!に置換されたdocument2.docが作成されます。
ソースコード
win32ole_ooo.rb
#! ruby -Ks # -*- coding: shift_jis -*- require 'win32ole' # OOoのCOMオブジェクトを作成 manager = WIN32OLE.new('com.sun.star.ServiceManager') stardesktop = manager.createInstance('com.sun.star.frame.Desktop') load_url = "file:///d:/document1.doc" save_url = "file:///d:/document2.doc" # ファイルを開く doc = stardesktop.loadComponentfromUrl(load_url, '_hidden', 0, []) # テキストの取得(置換前) text = doc.getText.string() p text # 置換 replace = doc.createReplaceDescriptor replace.SearchString = "Hello" replace.ReplaceString = "GoodBy" doc.replaceAll(replace) # テキストの取得(置換後) text = doc.getText.string() p text # 形式を指定して保存 opt = manager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") opt.Name = "FilterName" opt.Value = "MS Word 97" #opt.Value = "MS Word 2003 XML" #opt.Value = "text" property = [opt] doc.storeAsURL(save_url, property) # オブジェクトを破棄 doc.dispose()
実行結果
D:\>ruby win32ole_ooo.rb "Hello World !" "GoodBy World !"
参考サイト
プログラミング言語からCOM経由でOOoドキュメントを操作するサンプルコード
http://www.oooforum.org/forum/viewtopic.phtml?t=9815
テキスト部位の置換
http://download.oracle.com/docs/cd/E19535-01/819-1332/faaki/index.html
OpenOffice.org BASIC プログラミングガイド
http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide/StarDesktop
*1:PowerPoint、その他Windowsアプリケーション含む