Home > C# > 目的別資料 > Office文書の操作 > Libre Office > Libre OfficeをC#で操作する

LibreOffice SDK7.3.1で、dllのタイムスタンプが更新されたので、C#で、LibreOffce(x64)を操作できるか確認する。できなかった。

新規作成日 2022-03-22
最終更新日
LibreOffice SDK7.3.1で、CliフォルダのDllのタイムスタンプが変化していた

LibreOffice 7.3.1 向けのLibreOffice SDK7.3.1で、CliフォルダのDllのタイムスタンプが変化していたので、新たに、プロジェクト作成し、Windows10 64bt、LibreOffice(x64)環境で、実行できるか確認を行ったが、今まで通り、LibreOffice(x64)は、C#では操作できなかった。

LibreOffice SDK7.3.2.2でも、Windows10 64bt、LibreOffice(x64)環境では、C#から、LibreOfficeは、操作できませんでした。

LibreOffice SDK7.3.1では、C#でLibreOfficeを操作したい場合、引き続き、LibreOffice(x86)版を使用する必要があります。

C#で、LibreOffice(x86)を操作する方法に関しては、「Visal Studioで、LibreOffice Calcを操作するプログラムを作成する」を参照してください。

動作確認した手順

新しいプロジェクトを作成します。

新しいプロジェクトを作成します。

WPFアプリ(.Net Framework)テンプレートを使用します。

WPFアプリ(.Net Framework)テンプレートを使用します。

「OperateeLibreOfficeX64CalcTest」というプロジェクト名で、プロジェクトを作成します。

「OperateeLibreOfficeX64CalcTest」というプロジェクト名で、プロジェクトを作成します。

ソリューションエクスプローラー内の「参照」を右クリックして、「参照の追加」を選択します。

ソリューションエクスプローラー内の「参照」を右クリックして、「参照の追加」を選択します。

追加する参照は、次の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
参照マネージャー

参照の履歴が、残っていれば、右クリックして「最近の参照のクリア」でクリアします。

「参照マネージャー」の左側の「参照」を選択し、追加するファイルを指定します。選択するファイルが表示されていなければ、右下の「参照」をクリックして、指定します。

ソリューションエクスプローラーで、以前のdllの参照を削除

LibreOffice SDK7.3.1で、タイムスタンプが新しくなったdllを使って動作を確認することが目的ため、それ以前のdllを参照して構築したプロジェクトのdllを差し替えて実行する場合、ソリューションエクスプローラーで、以前のdllの参照を削除してから、新たにdllへの参照を追加してください。

コードを入力します。内容は、以前と同じです。

MainWindw.xaml
<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>
MainWindow.xaml.cs
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!");
        }
    }
}

プロジェクトファイル

実行結果

ボタンを持つウィンドウが表示されます。

ボタンを持つウィンドウが表示されます。

ボタンを押すと例外が、発生します。

ボタンを押すと例外が、発生します。

参考

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が、投げられます。

参考

LibreOffice SDK7.3.1で、CliフォルダのDllのタイムスタンプが変化していましたが、これまで通り、LibreOffice(x64)は、操作できないようです。今後の更新に期待です。

参考

Libreofficeのコミュニティでの情報がありました。(2018-10)C# LibreOffice SDK

  • GAC (C:\Windows\ Microsoft.NET 14 \assembly) から LibreOffice DLL を取得するには、AssemblyResolve イベントをオーバーライドする必要がありました。
  • アプリケーションは同じ LibreOffice アーキテクチャがインストールされている状態で実行する必要があるため、AssemblyResolve イベントが適切な DLL を見つけられるように、32 ビットと 64 ビットの 2 つの実行可能ファイルを生成する必要がありました (「32 ビット優先」プロジェクト プロパティをオンまたはオフにします)。
  • Windows レジストリにある環境変数「UNO_PATH」を設定するために、もう 1 つの変更が必要でした。
このエントリーをはてなブックマークに追加

Home PC C# Illustration

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