スポンサーリンク

WSHバッチで,OpenOffice.org Calcを自動操作する方法 (表計算のブックを,COM経由で新規作成・読み書き・保存)


Microsoft OfficeのExcelは,タブレット・スマホでは無料化したものの,
デスクトップ環境ではまだ有料。


オフィス・ソフトの代金を節約するため,
フリーソフトのOpenOfficeで代用している人も多い。


ところでMS OfficeをVBAなどで自動操作できるのと同じく,
OpenOfficeもバッチから呼び出し,文書を読み書きできる。


ここでは,OpenOffice.org(OOo)の表計算ソフトであるCalcを,
Windowsでバッチから呼び出すようなサンプルコード
を掲載する。


OOoがインストールしてあれば,すぐに実行可能。

下記のコードをooo.jsで保存してダブルクリックするだけ。

※バッチはWSH/JScriptで記述した。VBScriptでも動く。

// OpenOfficeを操作
var service_manager = WScript.CreateObject("com.sun.star.ServiceManager");
var desktop = service_manager.createInstance("com.sun.star.frame.Desktop")


// Calcの新規ブックを作成して開く
var doc = desktop.loadComponentFromURL(
	"private:factory/scalc", 
	"_blank", 
	0, 
	[]
);
  // ファイルパスを指定して既存のブックを開きたい場合は,
  // 第一引数の "private:factory/scalc", を
  // "file:///C:/フォルダ名/開きたいブック.odt" のように書き換える。

// 1枚目のシート
var sheet = doc.Sheets.getByName("Sheet1");
  // シート名ではなく番号で取得したい場合:
  // var sheet = doc.Sheets.getByIndex( 0 );
  // ※Sheets(0)という記法だとうまくいかない場合がある

// セルに書き込み
sheet.getCellByPosition( 0, 0 ).String = "ゎぃ ゎ ヵッォ ゃ" 
sheet.getCellByPosition( 0, 1 ).Formula = "=1+1";

// ファイルは既存か?
if( doc.hasLocation() && ( ! doc.isReadOnly() ) ){
	// 上書き保存
	doc.store();
}
else
{
	// ブックを新規保存
	doc.storeAsURL( "file:///C:/temp/テスト1.odt", [] );
}

// Calcを終了
//desktop.terminate();


WScript.Echo("ブックの作成と保存が終了しました。");

上記のバッチを実行すると,コード中の通りのファイルパスに,新規ブックが保存される。

日本語のファイル名も,まったく問題なく扱うことができている。

これをひな形にして,Calcでの操作をどんどん自動化しよう。


バッチでOOo Calcを起動および終了するための参考:

VBScriptでOpenOffice.org Calcを操作する - yakmi
http://qinmoksay.blog72.fc2.com/blog-...

  • 新規にブックを作って、セルに書き込む Set OSM = WScript.CreateObject("com.sun.star.ServiceManager")


VBからOpenOffice.orgを操作する (トピック) • OpenOffice.org コミュニティーフォーラム
https://forum.openoffice.org/ja/forum...

  • WindowsマシンにOOoがインストールされていることが前提です。 なおマシンに複数バージョンのOOoだったりStarSuiteがインストールされている場合、どの バージョンが反応するかは、レジストリに登録されている値次第で変わる


OpenOffice.org Forum :: Trying to terminate a Desktop (OOo crashes, Hello Dr.Watson)
http://www.oooforum.org/forum/viewtop...

  • Desktop.Terminate


シート内容の操作(シートの読み書きとブックの保存):

Macroの杜(OpenOffice.org/LibreOffice Basic編)/ Calc No.1
http://openoffice3.web.fc2.com/OOoBas...

  • VBAではcells(行,列)であるが、OpenOffice BasicではgetCellByPosition(列,行)である事に注意。


セルと範囲 - Apache OpenOffice Wiki
https://wiki.openoffice.org/wiki/JA/D...

  • 数値を入力するには Value 属性、テキストを入力するには String 属性、数式を入力するには Formula 属性をそれぞれ使用します。


StarDesktop - Apache OpenOffice Wiki
https://wiki.openoffice.org/wiki/JA/D...

  • ドキュメントの保存とエクスポート OpenOffice.org ドキュメントの保存処理は、ドキュメントオブジェクトを通じて直接実行されます。このような処理を行うには、com.sun.star.frame.XStorable インターフェースの store メソッド


コーディングをミスると,下記のようなエラーメッセージが表示される。

loadComponentFromURLとかstoreAsURLの最後の引数に,空配列を渡すと解決できる。

OpenOffice.org Forum :: Printing Spreadsheets in VB.NET
http://www.oooforum.org/forum/viewtop...

  • UnoConversionUtilities<T>::dispatchExObject2Sequence Conversion of dispatch object to Sequence failed!

追記

ウィンドウを非表示(hidden, invisible)のまま実行するには,下記のようにする。

// OpenOfficeを操作
// 原型:http://language-and-engineering.hatenablog.jp/entry/20141227/OOoCalcByWSHJScript
var service_manager = WScript.CreateObject("com.sun.star.ServiceManager");
var desktop = service_manager.createInstance("com.sun.star.frame.Desktop")


// 画面上で非表示(hidden)モードで動作するためのプロパティ
var arg1 = service_manager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
arg1.Name = "Hidden";
arg1.Value = true;


// Calcの新規ブックを作成して開く
var doc = desktop.loadComponentFromURL(
	"private:factory/scalc", 
	"_blank", 
	0, 
	[ arg1 ] // ここを配列にするのがミソ
);

// バッチの動作しているカレントフォルダ
var current_dir = WScript
	.ScriptFullName
	.replace(/[^\\]+$/g, "")
	.replace(/\\/g, "/")
;

// ブックを新規保存
doc.storeAsURL( "file:///" + current_dir + "テスト1.odt", [] );

// ブックを閉じる
doc.close(true);
	// https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=60766


WScript.Echo("ブックの作成と保存が終了しました。");

上記バッチを実行すると,カレントフォルダに表計算ファイルが生成される。

OpenOfficeのウィンドウは表示されない。


参考,hiddenプロパティの渡し方:

AddinBox/VBAユーザーの為のOpenOffice.org 備忘録:非表示ドキュメント(Hidden=True)の注意事項
http://blog.livedoor.jp/addinbox/arch...

  • Dim aArg(1) As New com.sun.star.beans.PropertyValue


Add an event listener using document events API (View topic) • Apache OpenOffice Community Forum
https://forum.openoffice.org/en/forum...

  • var arg1 = smgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue");


VBからOpenOffice.orgを操作する (トピック) • OpenOffice.org コミュニティーフォーラム
https://forum.openoffice.org/ja/forum...

  • Set args(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")


C++BuilderからOLEでExcelを制御しファイルを読む
http://www.acot.net/excelread/index.html

  • Variant prop = vOpenOffice.OleFunction( "Bridge_GetStruct", (OleVariant)"com.sun.star.beans.PropertyValue");

関連する記事:

WSH/JScriptで,Excelファイルを読み書きする際のテンプレート (シート上の全行を読み書きするコードのひな型)
http://language-and-engineering.hatenablog.jp/entry/20140214/p1


CSVをExcelファイルに変換するスクリプト (JScript/WSHで,カンマ区切りCSVファイルから.xlsを生成)
http://language-and-engineering.hatenablog.jp/entry/20090718/p1


Excelブックの「シート目次」を,自動的に作成するバッチ (WSH/JScriptで,各シートへのリンク付きの目次を自動生成)
http://language-and-engineering.hatenablog.jp/entry/20110921/p1


WSH/JScriptで,Excelのデータを自動でグラフ描画 (題材:はてなカウンターのアクセス数を週ごとにグラフ化)
http://language-and-engineering.hatenablog.jp/entry/20140213/p1