実際に、LibreOfficeを操作するC#プログラムを作成します。
C#アプリケーションから、Calcを開いて、Cell(0, 0)、つまりA1のいちに、にHello World!と表示します。
実行した環境
実際に、LibreOfficeを操作するC#プログラムを作成します。
- Windows 10 pro (x64) 21H2 19044.1586で実行しました。
- Visual Studio 2019 Communityを使用しました。
- LibreOfficeとLbreOffice SDKは、バージョン7.3.0を使用しました。
LibreOffice SDK 7.3.0では、LibreOffice(x64)には、対応していないようで、例外が発生します。LibreOffice(x86)では、操作できることを確認しました。
※通常のインストールでは、x64版とx86版のLibreOfficeは、共存できません。x64版をインストールした状態で、x86をインストールすると、x64版は削除されてしまいました。開発やサポートに参加される方向けに、複数のバージョンのLibreOfficeをインストールする方法が提供されてるので、そちらを参照してください。
C#で、LibreOffice(x64)を操作する
LibreOffice(x64)とLbreOffice SDKは、バージョン7.3.0,、7.3.1、7.5.2では、例外が発生して、動作しませんでした。7.5.2では、C#コードをx86でビルドしても例外が発生して動作しないことを確認しました。
私の認識している範囲では、バージョン 7.5.2まででは、C#で、LibreOfficeを操作するためには、LibreOffice(x86)つまり、LibreOfficeは、32bit版を使用する必要があるようです。
LibreOffice(x64)とLbreOffice SDKは、バージョン7.3.0,、7.3.1、7.5.2では、例外が発生して、動作しませんでした。7.5.2では、C#コードをx86でビルドしても例外が発生して動作しないことを確認しました。
Visual Studioを起動し、「新しいプロジェクトを作成」します。
「WPF アプリ(.NET Framework)」を選択します。
プロジェクト名に「OperateLibreOfficeCalcTest」を指定して、「作成」をクリックしました。※好きなプロジェクト名にしてください。
ソリューションエクスプローラー内の「参照」を右クリックして、「参照の追加」を選択します。
追加する参照は、次の6つです。
LibreOffice本体内のファイル
- cli_uno.dll
C:\Program Files\LibreOffice\program (64bit版の場合の所在)
LibreOffice SDK内のファイル
- cli_basetypes.dll
- cli_cppuhelper.dll
- cli_oootypes.dll
- cli_ure.dll
- cli_uretypes.dll
C:\Program Files\LibreOffice\sdk\cli (64bit版の場合の所在)
「参照マネージャー」の左側の「参照」を選択し、追加するファイルを指定します。選択するファイルが表示されていなければ、右下の「参照」をクリックして、指定します。
<Window x:Class="OperateLibreOfficeCalcTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="100" Width="200">
<Grid>
<Button Click="Button_Click">Calcを操作する</Button>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// LibreOffice用
using uno.util; // Bootstrap
using unoidl.com.sun.star.frame; // XComponentsLoader
using unoidl.com.sun.star.lang; // XMultiServiceFactory
using unoidl.com.sun.star.sheet; // XSpreadsheetDocument, XSpreadsheet
using unoidl.com.sun.star.table; // XCell
using unoidl.com.sun.star.uno; // XComponentContext
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.util;
namespace OperateLibreOfficeCalcTest
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// LibreOfficeと接続する
//コンポーネントコンテキストの取得
XComponentContext context = Bootstrap.bootstrap();
//サービスマネージャの取得
XMultiServiceFactory factory =
(XMultiServiceFactory)context.getServiceManager();
//コンポーネントローダの取得
XComponentLoader loader =
(XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop");
// Calcを新規に起動する
// 空のスプレッドシート文書を作成する
XComponent component = loader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]);
XSpreadsheetDocument spredsheetDocument = (XSpreadsheetDocument)component;
//シートの取得 LibreOffice Calcでは、新規にブックを作成したときのシート名は、”Sheet1”です。
XSpreadsheets sheets = spredsheetDocument.getSheets();
XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value;
//セルに出力
sheet.getCellByPosition(0, 0).setFormula("Hello World!");
}
}
}
参考
LibreOffice(x64)では、例外が発生し実行できない。
実行すると、ボタンを持つウィンドウが表示されます。
ボタンを押すと例外が、発生します。
System.BadImageFormatException
HResult=0x8007000B
Message=ファイルまたはアセンブリ 'cli_cppuhelper, Version=1.0.23.0, Culture=neutral, PublicKeyToken=ce2cb7e279207b9e'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
Sunによって構築されたOOo 3.0(OOoは、OpenOffice.orgを示す)は、32 bit Windows向けに作られていますが、64 bitでも動作します。64bit版で、CLI アプリケーションを実行するには、32 biの.Net Frameworkをインストールする必要があります。(OOo 3.0のversion 3.5)。アプリケーションは、x86プラットホーム向けに構築する必要があります。(プラットホームのcsc.exeの切り換えを参照して下さい)、それ以外の場合には、それは実行しません。anycpuやx64を使用する場合、アプリケーションは、64bit処理で読み込まれます。OOoに接続してブリッジを作成するには、この処理は、32bit DLLであるOOoから、いくつかのdllを読み込む必要があります。これは、動作しません、そして、System.BadImageFormatExceptionが、投げられます。
参考
私は、Windows10(x64)、LibreOffice(x64) 7.3.0、LibreOffice SDK 7.3.0で、挑戦しましたが、動かすことができませんでした。バージョンアップによる対応を期待しましょう。
LibreOffice(x86)をWindows 10(x64)にインストールし、C#からLibreOffice(x86)が操作できるか確認して見る
LibreOffce(x64)をWindows 10(x64)で使用しているが、C#から、LibreOfficeを操作しようとすると例外が発生する。LibreOffce(x86)をWindows 10(x64)で使用してC#からLibreOffice(x86)が操作できるか確認して見ることにした。
LibreOffce(x64)は、アンインストールせず、LibreOffice(x86)を追加でインストールした。バージョンは、7.3.1を使用した。しかし、通常のインストールでは、LibreOffce(x64)が、アンイストールされ、LibreOffice(x86)がインストールされた。LibreOfficeSDKの場所は、「C:\Program Files\LibreOffice\program 」のまま。
LibreOffice(x86)をインストールし、cli.ure.dll参照を入れ替えてC#からLibreOffice(x86)が操作できるか確認して見る。
参照の追加からは、同名のdllの差し替えはできなかったので、x86版の「cil_uno」を参照に追加する前に、ソリューションエクスプローラーの参照から、「cil_uno」を削除する。
Visual Studioでビルド対象を、x86に変更します。
Sunによって構築されたOOo 3.0は、32 bit Windows向けに作られていますが、64 bitでも動作します。64bit版で、CLI アプリケーションを実行するには、32 bitの.Net Frameworkをインストールする必要があります。(OOo 3.0のversion 3.5)。アプリケーションは、x86プラットホーム向けに構築する必要があります。(プラットホームのcsc.exeの切り換えを参照して下さい)、それ以外の場合には、それは実行しません。anycpuやx64を使用する場合、アプリケーションは、64bit処理で読み込まれます。OOoに接続してブリッジを作成するには、この処理は、32bit DLLであるOOoから、いくつかのdllを読み込む必要があります。これは、動作しません、そして、System.BadImageFormatExceptionが、投げられます。
参考
ディバック対象をx86にするには、Any CPU右側のドロップダウンをクリックして、「構成マネージャ」を選択します。
プラットフォームのAny CPUをクリックして、新規作成を選択します。
新しいプラットフォームをx86に変更します。
LibreOffice(x86)のCalcが立ち上がり、A1セルに、「Hello World!」と入力された。
正常に動作することを確認しました。