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

C# による OpenOffice (LibreOffice) Calc の操作(2) で作成したプログラムの改良を行う。
 

 

セットアップ

LibreOffice を C# で操作するためのセットアップ(インストール)はこちらを参照。
 

追加する機能

前項のコードに対して以下の機能を追加する。

  • 別名、かつ xls 形式で保存する
  • xlsx ではなく xls 形式にする理由は以下である
    • ods から xlsx で保存する際にファイルが壊れることがある
    • このとき xls 形式であれば、壊れた箇所を破棄して Excel が表示してくれるためである。
      • 他方、xlsx 形式であれば、 Excel が(書式が)壊れていると判断して表示してくれない
  • ods → xlsx への変換は簡単では無い模様。

 

実装

別名かつ書式を xls で保存する

変更点
+using unoidl.com.sun.star.util;         // XCloseable

(--snip--)

+        PropertyValue[] args2 = new PropertyValue[1];
+        args2[0] =  new PropertyValue()
+                    {
+                        Name = "Overwrite",
+                        //Value = new uno.Any((Boolean)true),
+                    };
+
+        var path2 = @"file:///c:/Users/neko/cs/LibreOfficeSample/Output.xls";
+        ((XStorable)doc).storeAsURL( path2, args2 );
+        ((XCloseable)doc).close(true);

 

全文
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

using unoidl.com.sun.star.beans;        // Property
using unoidl.com.sun.star.util;         // XCloseable

class Savings {
    static void Main(string[] args) {
        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");

        // 非表示(invisible)で操作するための属性を作成し付与する
        PropertyValue[] args1 = new PropertyValue[1];
        args1[0] =  new PropertyValue()
                    {
                        Name = "Hidden",
                        Value = new uno.Any((Boolean)true),
                    };

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

        // シートオブジェクトを取得する
        XSpreadsheets sheets = doc.getSheets();
        //「Sheet1」シートにアクセスする
        XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value;
        // B2 セルにアクセスする
        XCell cell = sheet.getCellByPosition(1, 0);     // B列、1行目
        Console.WriteLine("{0}", cell.getFormula());
        cell.setFormula("レート");                      // セルに文字列代入
        Console.WriteLine("{0}", cell.getFormula());
        cell = sheet.getCellByPosition(1, 0);           // セルを選択(B列、1行目)
        cell.setValue(110.23);                          // セルに数値代入
        Console.WriteLine("{0}", cell.getValue());
   
        // 保存時の属性を設定する
        PropertyValue[] args2 = new PropertyValue[1];
        args2[0] =  new PropertyValue()
                    {
                        Name = "Overwrite",
                    };

        var path2 = @"file:///c:/Users/neko/cs/LibreOfficeSample/Output.xls";
        ((XStorable)doc).storeAsURL( path2, args2 );
        ((XCloseable)doc).close(true);
    }
}