【C#】C# による OpenOffice (LibreOffice) Calc の操作(1)

概要

OpenOffice SDK は Version 3.2 で完了したらしく、その後は LibreOffice と Apache OpenOffice に分かれた模様。
今回は LibreOffice SDK に含まれる dll を使用して Excel ファイルの操作をする。
 

 

インストール

LibreOffice と LibreOfficeSDK の 2つをインストールして cli*dll を取得する。
 

LibreOffice のインストール

https://www.libreoffice.org/donate/dl/win-x86_64/6.1.3/ja/LibreOffice_6.1.3_Win_x64.msi より、LibreOffice_6.1.3_Win_x64 をダウンロードしインストールする。
 
LibreOffice のインストールが完了すると以下のように CLI 用の dll がインストールされている。

> Get-ChildItem -Recurse -Include "cli*.dll"

    ディレクトリ: C:\Program Files\LibreOffice\program

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018/10/30     20:03         399976 cli_uno.dll

 
 

LibreOffice SDK のインストール

Donate » LibreOffice より「LibreOffice_6.1.3_Win_x64_sdk.msi」をダウンロードしインストールする。
f:id:dnkrnka:20181120212942p:plain:w600
  
LibreOffice SDK のインストールが完了すると以下のように CLI*1用の dll がインストールされている。

> Set-Location C:\Program Files\LibreOffice_6.1_SDK\
> Get-ChildItem -Recurse -Include "cli*.dll"

C:\Program Files\LibreOffice_6.1_SDK\sdk\cli\
-a----       2018/10/30      0:35          10752 cli_basetypes.dll
-a----       2018/10/30      2:52         207872 cli_cppuhelper.dll
-a----       2018/10/30      2:48        1168896 cli_oootypes.dll
-a----       2018/10/30      2:50           7168 cli_ure.dll
-a----       2018/10/30      2:47         113152 cli_uretypes.dll

 
 

実装

Visual Studio でビルドをすると、実行ファイルの作成には成功するものの、実行すると Exception が発生してしまう。
他方、csc.exe を使ってビルドをすると問題なく実行することができた。
そこで、Visual Studio を使わないようにしてビルドをする。
 

LibreOfficeSample.css

using System;
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

class Savings {
    static void Main(string[] args) {
//      var path = @"C:\Users\neko\cs\LibreOfficeSample\PreCheckTemplate.xlsx";
        var path = @"file:///c:/Users/neko/cs/LibreOfficeSample/Input.xlsx";

        // コンポーネントコンテキストオブジェクトを取得する
        XComponentContext context = Bootstrap.bootstrap();
        // サービスマネージャの取得
        XMultiServiceFactory factory = (XMultiServiceFactory)context.getServiceManager();
        // コンポーネントローダオブジェクトを生成する
        XComponentLoader loader = (XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop");

        // 以上で準備が完了したので, LibreOffice のアプリ(Calc, Base, Draw など) の起動が可能になった
        
        // 既存の Excel ファイルを開く
        XSpreadsheetDocument doc = (XSpreadsheetDocument)loader.loadComponentFromURL(path, "_blank", 0, null);

        // シートオブジェクトを取得する
        XSpreadsheets sheets = doc.getSheets();
        //「Sheet1」シートにアクセスする
        XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value;

        //「B1」セルにアクセスし、セルの値を文字列として取り出す
        XCell cell = sheet.getCellByPosition(1, 0);     // B列、1行目
        Console.WriteLine("{0}", cell.getFormula());

        //「B1」セルに文字列を書き込む&セルの文字列を取り出す
        cell.setFormula("レート");                      // セルに文字列代入
        Console.WriteLine("{0}", cell.getFormula());

        //「B2」セルに文字列を書き込み、セルの値を文字列として取り出す
        cell = sheet.getCellByPosition(1, 1);           // B列、2行目
        cell.setValue(123.456);                         // 数値を代入する
        Console.WriteLine("{0}", cell.getValue());
    }
}

 

ビルド

ソースファイルと同じ階層に cli*.dll を配置した場合の例。

> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /nologo /r:.\cli_basetypes.dll /r:.\cli_cppuhelper.dll /r:.\cli_oootypes.dll /r:.\cli_uno.dll /r:.\cli_ure.dll /r:.\cli_uretypes.dll /out:a.exe .\LibreOfficeSample.cs

 

*1:Common Language Infrastructure