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

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

OpenOffice.orgのマクロをPythonで記述して動かす(Calc上でマクロが動作しているかのチェックと全シートのオブジェクトの取得に関するメモ)

OpenOffice.orgのマクロをPythonで記述して動かす(概要,ファイル配置,ダイアログの表示)」の続きとして、ここでは、Python-UNOを用いてOpenOffice.org Calc上でマクロが実行されているかどうかのチェックとOpenOffice.org Calcの全てのシートのデータを保持するオブジェクトの取得に関してを扱う。
メモの続きとコード例は別記事で扱う。

Calc上でマクロが実行されているかどうかのチェック

「XSCRIPTCONTEXT.getDocument()」で得たドキュメントオブジェクトのメンバ関数supportsService()に「com.sun.star.sheet.SpreadsheetDocument」を指定するとOpenOffice.org Calc内でマクロが実行された場合にTrue、そうでない場合にFalseが返る。
OpenOffice.orgのマクロはドキュメントを開いていないとき(「ようこそ」の画面)や他のWriterなどのアプリケーションが動作しているときにも実行でき

そうした場合にOpenOffice.org Calc固有の処理を実行しようとするとエラーになるが、最初の段階でこれをチェックしておくとうまく処理できる。
(2010/4/8)下の流れを改善したものを「OpenOffice.orgのマクロをPythonで記述して動かす(Calc上でマクロが動作しているかのチェックを改善)」に貼り付けた。

class Bridge(object):
  def __init__(self):
    self._desktop = XSCRIPTCONTEXT.getDesktop()
    self._document = XSCRIPTCONTEXT.getDocument()
    ...

class OOoCalc(Bridge):
  def __init__(self):
    Bridge.__init__(self)  # 必須
    # Calcの中から実行されたならTrue,それ以外ならFalse
    # http://api.openoffice.org/docs/common/ref/com/sun/star/lang/XServiceInfo.html
    self.__supported = self._document.supportsService('com.sun.star.sheet.SpreadsheetDocument')
    if self.__supported:
      # Calc内で実行されたときの処理をここに記述
  @property
  def supported(self): return self.__supported

def macroname():
  calc = OOoCalc()
  # Calcの中かどうかをチェックする
  if not calc.supported:
    # ここにエラーダイアログを表示する処理を記述
    return
  else:
    # ここにCalcを用いたマクロのメイン処理を記述

全シートのオブジェクトを取得

全てのシートは先述のドキュメントオブジェクトのプロパティSheetsかメンバ関数getSheets()で取得できる。

class OOoCalc(Bridge):
  def __init__(self):
    Bridge.__init__(self)
    # (Calc上でマクロが実行されたかを先にここでチェックしておく)
    #
    # Calcのシート一覧
    # http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XSpreadsheetDocument.html
    self.__sheets = self._document.Sheets
  @property
  def sheets(self): return self.__sheets

(2010/4/8)記述を微調整
シートに関する操作はこのオブジェクトを通して行う。

(「OpenOffice.orgのマクロをPythonで記述して動かす(Calcのシート追加に関するメモとシート追加のコード例)」に続く)

関連記事:

参考URL:

使用したバージョン: