Home > C#

C#で、LibreOfficeに接続するコードを確認する

新規作成日 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;
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」