6月のカレンダー
      1
2345678
9101112131415
16171819202122
23242526272829
30      
最近の日記
全体の新着
各月の日記
ユーザーRSS
hanyaさんの公開日記
07月22日
22:27
Calc のシート関数として Basic の Standard ライブラリに入れた関数が利用できる。しかし、これらの関数はセルへの参照を引数として得ることができない。どのようにして関数を定義してもセルオブジェクトではなく値が渡される。また、ドキュメントに含めて配布できるため便利。が、意外に遅い。また、

一方で、拡張機能でシート関数を配布できる。これは IDL の定義で引数に参照を指定できる。一方で、ドキュメントと一緒に配布できないため別の環境でもインストールされている必要がある。
速度は実装する言語によるが、それほど遅くはない。呼び出し回数の多い関数であれば api を利用したこの方法のほうがよい。

たとえば、セルへの参照を引数にとる関数であれば次のような IDL を書く。引数の型を css.table.XCellRange とする。

bgColorRef 関数は最初の引数で指定したセルに2番目の引数で指定したセルの背景色を設定する。

#ifndef __mytools_sheet_addin_XCellBackgroudColorRef_idl__
#define __mytools_sheet_addin_XCellBackgroudColorRef_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_table_XCellRange_idl__
#include <com/sun/star/table/XCellRange.idl>
#endif

module mytools { module sheet { module addin {
interface XCellBackgroudColorRef : ::com::sun::star::uno::XInterface
{
any bgColorRef( [in] ::com::sun::star::table::XCellRange xDestCellRange, [in] ::com::sun::star::table::XCellRange xSourceCellRange );
};
}; }; };

#endif

idlc でコンパイル、regmerge で rdb ファイルにしておく。拡張機能マネージャから RDB ファイルを選択してインストール。

次に、関数を好きな言語で UNO コンポーネントとして実装する。たとえば、Python で。親クラスは省略。

class SheetAddInFn(AddInBase, XCellBackgroudColorRef):

Imple_Name = 'mytools.sheet.addin.CellPropertyAddInFn'
# 関数ウィザード表示
functions = {
'bgColorRef': {'DisplayName': 'BGColorRef',
'Arguments': ['Dest Cell', 'Source Cell'],
'Description': 'To get cell property value.',
'ArgumentDescriptions': ['The cell to set its background color',
'The base cell to get background color'],
'Category': 'Add-in'}
}

def __init__(self, ctx, *args):
AddInBase.__init__(self, ctx)

# XCellBackgroudColorRef
def bgColorRef(self, dest, source):
if source and dest:
dest.setPropertyValue('CellBackColor', source.getPropertyValue('CellBackColor'))
return ''


g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(
SheetAddInFn, SheetAddInFn.Imple_Name,
('com.sun.star.sheet.AddIn',))

インデントが崩れてよくわかりませんが…。拡張機能マネージャからインストール。

セルに =BGCOLORREF(A1,A2) とすると A2 の背景色が A1 に設定される。

作成するのは非常に簡単だけどさっぱり利用されないアドイン関数。(API ベースのものは以前のアドイン関数とは少し違います)
配布するならもちろん拡張機能の OXT パッケージにするべきです。

頻繁に利用するファイルや、ターゲットとする利用者の範囲が狭ければ、こういったものを利用しても問題無いと思います。
数値計算が多いのであれば Java か C++ で。数万以上のセルで利用されて API 呼び出しが気になるのであれば C++ で。試してみるなら Python で。UNO コンポーネントを実装する言語を変更しても IDL はそのまま利用できます。
Java の場合、JVM の起動が少し遅いですが、大抵オフィースソフトは開きっぱなしのことが多いでしょうから、一度起動すれば特に問題はありません。C++ で書くと利用者と環境同じコンパイル環境を用意するのが面倒。

追記:
API で作成するアドイン関数では返り値をセルへの参照にできない。
関数の引数を参照にすると関数の動作を決定するときに困ることがある。
例1: FUNCTION1(Ref1;Ref2)
Ref1 に Ref2 の背景色を設定する、とする。このとき、Ref2 から値を取得してこの数式が入力されたセルに表示したいとき。
参照が返せないので、Ref2 が数値のときには getValue から。
Ref2 が文字列のとき、問題なし。
Ref2 が数式で結果が文字列か数値のとき。数値であれば getValue で問題ない。しかし、文字列のときにはそのセルの表示文字列が決定されていないため「...」しか取得できない。とはいえ、その Ref2 セルの数式の結果がどちらか判断できない。

例2: FUNCTION2(Ref1;Ref2;any)
Ref1 に Ref2 の背景色を設定、数式の返り値として3番目の値を返す、とする。関数を定義するときに引数の型に any 指定すると、渡される値は渡される値などに応じて double または string になる。参照は渡されない。関数は値をそのまま返すだけ。

Ref1 をこの関数を入力するセルとして Ref2 の値をそのまま表示させようとするから面倒。別のセルにこの関数を入力しておいて Ref2 の値が変更されれば勝手にアップデートされる…という使いかたなら例 1 の方法でもよい。
OOo ではその関数が入力されたセルを取得できないため、Ref1 参照がどうしても必要。(Basic で定義した関数では参照にできない。そのためシート、行、列を数値で指定しなくてはいけない)

結論:
- 面倒なことをしたくなければアドイン関数は使わないこと。
- アドイン関数は数値計算に使う。
- Basic の関数では引数にセルへの参照を渡すことができない。
- IDL で定義した関数で引数に参照を受けとるには css.table.XCellRange 型とする。
- IDL で定義した関数からは参照を返せない。

今度どこかにまとめます。
公開日記トップへ
oooug-jp SNS

●サイドメニュー

  • 公開日記
  • >公開日記はログインしなくても読めます

http://www.ospn.jp/

inetd