試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル内容へのアクセスに関する追加メモ・ページ2/3)

OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル操作に関する追加メモ・ページ1/3)」の続き。

定数の指定について

OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル操作に関する追加メモ・ページ1/3)」で扱ったセルオブジェクトのプロパティの中には幾つかの定数の中から1つを選んで指定するという形のものがあり、これを指定するにはその実際の値を問い合わせて得るという処理が必要となる。

定数の種類

定数には2種類あり、値に意味があるかどうかによって

  • enum型:どれが選択されたかだけを示す/値に意味がない(具体的な値を持たない)
  • constant型:値に意味があり、その値に展開される

と分かれる。
enum型の例は
http://api.openoffice.org/docs/common/ref/com/sun/star/table/CellHoriJustify.html
で、この場合、文字の水平方向の「寄せ」の設定を幾つかの中から選択する。このパスは「com.sun.star.table.CellHoriJustify.CENTER」となる。
constant型の例は
http://api.openoffice.org/docs/common/ref/com/sun/star/awt/FontWeight.html
で、この場合、文字の太さが細かくfloat型で指定できる中の幾つかの値に名前を付けて、「NORMAL」では100.0%,「BOLD」では150.0%といった具合に名前からそれに対応した値が簡単に指定できるようになっている。このパスは「com.sun.star.awt.FontWeight.BOLD」となる。

定数を得る

enum型の場合、パスの最後の定数名を除いた部分を1番目,定数名を2番目のコンストラクタ引数に文字列として入れ、uno.Enumオブジェクトを作成する。

import uno
com_sun_star_table_CellHoriJustify_CENTER = uno.Enum('com.sun.star.table.CellHoriJustify', 'CENTER')

constant型の場合、パスの全体をuno.getConstantByName()関数に渡す。

import uno
com_sun_star_awt_FontWeight_BOLD = uno.getConstantByName('com.sun.star.awt.FontWeight.BOLD')

いずれの場合も、値を繰り返し用いる場合は上のように変数に入れておくとよい。
なお、enum型が(uno.Enumという型の)オブジェクトとして得られるのは以下のようにしてPythonシェルから確認できる。

>>> import uno
>>> uno.Enum
<class uno.Enum at 0xXXXXXXXXXXXX>
com_sun_star_table_CellHoriJustify_CENTER = uno.Enum('com.sun.star.table.CellHoriJustify', 'CENTER')
>>> com_sun_star_table_CellHoriJustify_CENTER
<uno.Enum com.sun.star.table.CellHoriJustify ('CENTER')>

一方でconstant型では単なる値として得られることが分かる。

>>> import uno
>>> uno.getConstantByName('com.sun.star.awt.FontWeight.SEMIBOLD')
110.0
>>> uno.getConstantByName('com.sun.star.awt.FontWeight.BOLD')
150.0
>>> uno.getConstantByName('com.sun.star.awt.FontWeight.BLACK')
200.0

色を指定するためのRGB()関数を実装

OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル操作に関する追加メモ・ページ1/3)」で少し触れたが、::com::sun:型の色指定においては16進表記が便利だが、下のような関数をマクロファイル内に定義して赤/緑/青それぞれの成分を0から255の範囲で指定するようにすることもできる。

def RGB(red, green, blue):
  return red * 0x010000 + green * 0x000100 + blue * 0x000001

ただし、このままだと範囲外の値が誤って指定されてもチェックはしないので、それで問題があればチェックをする処理を入れる必要がある。例えば、ユーザ定義例外を用いて下のようにする。

class InvalidColorException(Exception):
  def __init__(self, red, green, blue):
    (self.__red, self.__green, self.__blue) = (red, green, blue)
  def __str__(self):
    return 'Invalid color(R=%d,G=%d,B=%d)' % (self.__red, self.__green, self.__blue)

def RGB(red, green, blue):
  if red > 0xff or red < 0x00 or \
   green > 0xff or green < 0x00 or \
   blue > 0xff or blue < 0x00:
    raise InvalidColorException(red, green, blue)
  return red * 0x010000 + green * 0x000100 + blue * 0x000001

これでユーザ定義関数RGB()の引数のいずれかに無効な範囲の値が指定されたときに例外のダイアログが出て処理が止まるようになる。

(「OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル内容へのアクセスに関する追加メモ・ページ3/3)」に続く)

関連記事:

参考URL:

使用したバージョン: