2008年1月22日火曜日

Java-Com Bridgeを使う

以下のようなVBScriptがあります。

===========================================================
'日本語から英語への翻訳の場合に、全角の英数字、記号を半角に変換するスクリプトです
Dim objWord
Set objWord = CreateObject("Word.Application")
'objWord.Visible = TrueobjWord.Documents.Open(WScript.Arguments.Item(0))
' 検索条件の指定 objWord.Selection.Find.ClearFormatting
objWord.Selection.Find.Text = "[0-9A-Za-z!-?「」[] .,]"
objWord.Selection.Find.Forward = True
objWord.Selection.Find.Wrap = 1
objWord.Selection.Find.Format = False
objWord.Selection.Find.MatchCase = False
objWord.Selection.Find.MatchWholeWord = False
objWord.Selection.Find.MatchByte = False
objWord.Selection.Find.MatchAllWordForms = False
objWord.Selection.Find.MatchSoundsLike = False
objWord.Selection.Find.MatchFuzzy = False
objWord.Selection.Find.MatchWildcards = True

Do While objWord.Selection.Find.Execute
objWord.Selection.Range.CharacterWidth = 6
objWord.Selection.MoveRight
Loop

objWord.Selection.WholeStory
objWord.Selection.Font.Name = "MS Pゴシック"
objWord.ActiveDocument.Save
objWord.Documents.Close
objWord.Quitset objWord = nothing

===========================================================

これをJacob.jar(http://www.land-of-kain.de/docs/jacob/)を使用してJavaで実行しようとすると以下のようになります。

===============================================================
import com.jacob.com.*;
import com.jacob.activeX.*;

中略

String openUrl = "D:\Test\sample.doc";

ActiveXComponent oWord = new ActiveXComponent("Word.Application");

try{
Object oDocuments = oWord.getProperty("Documents").toDispatch();
Object oDocument = Dispatch.call(oDocuments, "Open", openUrl).toDispatch();
Object oSelection = oWord.getProperty("Selection").toDispatch();

//ここから半角処理
Object oFind = oWord.call(oSelection, "Find").toDispatch();
Dispatch.call(oFind, "ClearFormatting");
Dispatch.put(oFind, "Text", "[0-9A-Za-z!-?「」[] .,]");
Dispatch.put(oFind, "Forward", true);
Dispatch.put(oFind, "Wrap", 1);
Dispatch.put(oFind, "Format", false);
Dispatch.put(oFind, "MatchCase", false);
Dispatch.put(oFind, "MatchWholeWord", false);
Dispatch.put(oFind, "MatchByte", false);
Dispatch.put(oFind, "MatchAllWordForms", false);
Dispatch.put(oFind, "MatchSoundsLike", false);
Dispatch.put(oFind, "MatchFuzzy", false);
Dispatch.put(oFind, "MatchWildcards", true);

while (Dispatch.call(oFind, "Execute").toBoolean()){
Dispatch oRange = Dispatch.call(oSelection, "Range").toDispatch();
Dispatch.put(oRange, "CharacterWidth", 6);
Dispatch.call(oSelection, "MOveRight");
}

Object oWholeStory = oWord.call(oSelection, "WholeStory");
Object oFont = Dispatch.get(oSelection, "Font").toDispatch();
Dispatch.put(oFont, "Name", "MS Pゴシック");
Object oActiveDocument = oWord.getProperty("ActiveDocument").toDispatch();
Dispatch.call(oActiveDocument, "Save");

} catch (ComFailException e){
System.err.println(e.getMessage() + e.getHResult());
} finally {
Dispatch.call(oWord, "Quit");
ComThread.Release();
}

使い方
MS Wordを操作するのであれば以下の2行は必ず必要です。

ActiveXComponent oWord = new ActiveXComponent("Word.Application");
Object oDocuments = oWord.getProperty("Documents").toDispatch();

次に例えばVBでobjWord.Selection.Range.CharacterWidth = 6 とある記述をJavaで書くには、まずRangeオブジェクトを作成、そこからCharacterWidthプロパティに6を入れるといった記述をする。
RangeはSelectionオブジェクトのメソッドなのでまずはSelectionオブジェクトを作成する。
Selectionオブジェクトの上はMS WordのActiveXComponentなので既にで作成されている。

ということで手順は
1. でSelectionオブジェクトの作成をする。
2. でRangeオブジェクトを作成する。
3. でCharacterWidthプロパティに値をセットする。

となる。
メソッドやプロパティに値をセットする時は必ずそれを実行するためのオブジェクトを作成する必要があります。

メソッドの実行方法
Dispatch.call(オブジェクト名, メソッド名);

プロパティの設定方法;
Dispatch.put(オブジェクト名, プロパティ名,プロパティ 値);

0 件のコメント:

自己紹介

最近気胸になりました。でタバコやめました。