Home > C# > 目的別資料 > Office文書の操作 > Libre Office > LibreOfficeをC#でReflectionとInterop テクノロジーを使用して操作する

LibreOfficeをC#でReflectionとInterop テクノロジーを使用して操作する

新規作成日 2023-04-11
最終更新日

LibreOffice(x86)は、LibreOffice SDKのCLI アセンブリを使用すると、32bitでコンパイルしたC#コードから操作することができます。LibreOffice バージョン7.5.2.2では、LibreOffice SDKを使用する方法では、LibreOffice(x64)を操作することはできないようです(可能かもしれませんが、方法が見つけられません)。

LibreOfficeをC#コードから操作する方法には、LibreOffice SDKを使用する方法の他に、ReflectionとInterop テクノロジーを使用する方法があります。Reflectionを使用する方法では、LibreOffice(x64)を問題なく操作でき、C#のコードを32bitでビルドしなければいけないという制約もありません。(Reflectionを使用すると、処理が遅くなると言われていますが、考えないことにします。)

C#でReflectionを使用してLibreOfficeを操作するコード例を探して、直ぐに利用できるようにまとめたいと考えました。

CalcをC#から起動する

コンソールアプリケーションです。

実行すると、Calcが起動し、空のスプレッドシートが開かれます。

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace LibreofficeCalcWithoutSDK
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //サービスマネージャの取得
            var t = Type.GetTypeFromProgID("com.sun.star.ServiceManager");
            var factory = Activator.CreateInstance(t);

            //コンポーネントローダの取得
            object[] getCopLoader = { "com.sun.star.frame.Desktop" };
            var loader = factory.GetType().InvokeMember("createInstance",
                BindingFlags.InvokeMethod, null, factory, getCopLoader);

            // Calcを新規に起動する
            // 空のスプレッドシート文書を作成する
            object[] objectBrank = { };
            object[] openCalc = { "private:factory/scalc", "_blank", 0, objectBrank };
            var doc = loader.GetType().InvokeMember("loadComponentFromURL",
                BindingFlags.InvokeMethod, null, loader, openCalc);

            Marshal.ReleaseComObject(factory);
        }
    }
}

参考

WriterをC#から起動する

コンソールアプリケーションです。

実行すると、Writerが起動し、空の文書が開かれます。

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace LibreofficeCalcWithoutSDK_2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //サービスマネージャの取得
            var t = Type.GetTypeFromProgID("com.sun.star.ServiceManager");
            var factory = Activator.CreateInstance(t);

            //コンポーネントローダの取得
            object[] getCopLoader = { "com.sun.star.frame.Desktop" };
            var loader = factory.GetType().InvokeMember("createInstance",
                BindingFlags.InvokeMethod, null, factory, getCopLoader);

            // Writerを新規に起動する
            // 空の文書を作成する
            object[] objectBrank = { };
            object[] openWriter = { "private:factory/swriter", "_blank", 0, objectBrank };
            var doc = loader.GetType().InvokeMember("loadComponentFromURL",
                BindingFlags.InvokeMethod, null, loader, openWriter);

            Marshal.ReleaseComObject(factory);
        }
    }
}

参考

このエントリーをはてなブックマークに追加

Home PC C# Illustration

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