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 !"

参考サイト

RubyでWin32OLEの基本から
るびま

プログラミング言語から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アプリケーション含む