新規作成日 2022-03-22
最終更新日
LibreOffice(やOpenOffice)は、コンポーネント・コンテクストの中にサービスマネージャーが、ただ1つだけ存在し、そのサービスマネージャがコンポーネント(CalcやWriterなど)起動します。
そして、それぞれのコンポーネント・コンテキスト内に複数のコンポーネントが格納されている仕組みのようです。
C#で、LibreOfficeに接続するためには、LibreOffice 、LibreOffice SDKに含まれているdllを参照に追加する必要があります。
C#で、LibreOfficeに接続するプログラムを作成する手順については、「Visal Studioで、LibreOffice Calcを操作するプログラムを作成する」を参照してください。
Bootstrapを使ってOpenOffice.orgの基本プロセスを起動する
例1 (引用:サンプルプログラムのSpreadsheetDocHelper.csの抜粋)
サンプルプログラムでは、基本プロセスを起動するメソッドを含むクラスは、System.IDisposableインターフェイスを継承している。(メモリリークの可能性を排除するため)
C#//コンポーネントコンテキストオブジェクト private unoidl.com.sun.star.uno.XComponentContext m_xContext; // サービスファクトリ(サービスマネージャ)実行中のオフィスを示す private unoidl.com.sun.star.lang.XMultiServiceFactory mxMSFactory; // スプレッドシート文書を示すオブジェクト private unoidl.com.sun.star.sheet.XSpreadsheetDocument mxDocument; public SpreadsheetDocHelper( String[] args ) { // Connect to a running office and get the service manager // 実行中のオフィスに接続し、サービス管理プログラムを取得します mxMSFactory = connect( args ); // Create a new spreadsheet document // 新しいスプレッドシート文書を作成します。 mxDocument = initDocument(); } /** Connect to a running office that is accepting connections. @return The ServiceManager to instantiate office components. 接続を受け入れている実行中のオフィスに接続します。 @return オフィス・コンポーネントをインスタンス化するServiceManager。*/ private XMultiServiceFactory connect( String [] args ) { m_xContext = uno.util.Bootstrap.bootstrap(); return (XMultiServiceFactory) m_xContext.getServiceManager(); }
参考
- LibreOffice SDKに付属のサンプルコードのSpreadsheetDocHelper.cs[C:\Program Files\LibreOffice\sdk\examples\CLI\CSharp\Spreadsheet]
例2 (引用:OpenOfficeのプロセス起動 presented by ワイワークス ソフトウェア)
名前空間も表記するスタイル
C#//コンポーネントコンテキストの取得 unoidl.com.sun.star.uno.XComponentContext localContext = uno.util.Bootstrap.bootstrap(); //サービスマネージャの取得 unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory = (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager(); //コンポーネントローダの取得 unoidl.com.sun.star.frame.XComponentLoader componentLoader = (unoidl.com.sun.star.frame.XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop");
例3 (C# で LibreOffice を操作する Hatada's Home Page(旧)、C#でLibreOfficeを使ってみよう とむのブログ)
C#名前空間をusingディレクティブで宣言するスタイル //コンポーネントコンテキストの取得 XComponentContext context = Bootstrap.bootstrap(); //サービスマネージャの取得 XMultiServiceFactory factory = (XMultiServiceFactory)context.getServiceManager(); //コンポーネントローダの取得 XComponentLoader loader = (XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop");
Calcを新規に起動する
C#コードの抜粋unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]) unoidl.com.sun.star.sheet.XSpreadsheetDocument spredsheetDocument = (unoidl.com.sun.star.sheet.XSpreadsheetDocument)component; //セルに出力 sheet.getCellByPosition(0, 0).setFormula("Hello World!");
Writerを新規に起動する
C#コードの抜粋unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]); unoidl.com.sun.star.text.XTextDocument textDocument = (unoidl.com.sun.star.text.XTextDocument)component;