Hatena::ブログ(Diary)

mikage014の日記 このページをアンテナに追加 RSSフィード

2011年04月27日

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の基本から

Rubyist Magazine - Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ

プログラミング言語からCOM経由でOOoドキュメントを操作するサンプルコード

no title

テキスト部位の置換

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/mikage014/20110427/1303915996
リンク元
Connection: close