Home > C# > 目的別資料 > Office文書の操作 > Libre Office > Calc >

Visal Studioで、LibreOffice Calcを操作するプログラムを作成する

新規作成日 2022-03-21
最終更新日

実際に、LibreOfficeを操作するC#プログラムを作成します。

C#アプリケーションから、Calcを開いて、Cell(0, 0)、つまりA1のいちに、にHello World!と表示する

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」を指定して、「作成」をクリックしました。

プロジェクト名に「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版の場合の所在)

参考

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

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!");
        }
    }
}

参考

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)が操作できるか確認して見る。

ソリューションエクスプローラーの参照から、「cil_uno」を削除する

参照の追加からは、同名のdllの差し替えはできなかったので、x86版の「cil_uno」を参照に追加する前に、ソリューションエクスプローラーの参照から、「cil_uno」を削除する。

Visual Studioでビルド対象を、x86に変更する。

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右側のドロップダウンをクリックして、「構成マネージャ」を選択します。

ディバック対象をx86にするには、Any CPU右側のドロップダウンをクリックして、「構成マネージャ」を選択します。

プラットフォームのAny CPUをクリックして、新規作成を選択します。

プラットフォームのAny CPUをクリックして、新規作成を選択します。

新しいプラットフォームをx86に変更します。

新しいプラットフォームをx86に変更します。

LibreOffice(x86)のCalcが立ち上がり、A1セルに、「Hello World!」と入力された。

LibreOffice(x86)のCalcが立ち上がり、A1セルに、「Hello World!」と入力された。

正常に動作することを確認しました。

プロジェクトファイル

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

Home PC C# Illustration

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