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