新規作成日 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);
}
}
}