Calc(32)sheet["A1"]とsheet[0, 0]とsheet[0:1, 0]の違い

2017-10-29

旧ブログ

t f B! P L
sheet["A1"]とsheet[0, 0]はいずれもセルA1を指す同一ものと考えていましたが、UNO APIの引数に渡すときにこれらは同一でないことに気が付きました。sheet[0:1, 0]はセル範囲としてはA1セルのみを指しますが、セルとは違います。

前の関連記事:Calc(31)セルへ日付を入力する方法


サービスとインターフェイスの比較ではsheet["A1"]とsheet[0, 0]はセル、sheet[0:1, 0]はセル範囲


Calc(13)セルとセル範囲とのサービスとインターフェイスの比較と同様の方法でTCUのwcompare()メソッドで比較しました。

sheet["A1"]とsheet[0, 0]はサービスとインターフェイスは一致し、どちらもセルのものと同じでした。

sheet["A1"]とsheet[0:1, 0]は、sheet[0:1, 0]にはSheetCellサービスはなく、セルとセル範囲の比較と同様の結果になりました。

sheet[0, 0]とsheet[0:1, 0]も、同様にセルとセル範囲の比較の結果と同様になりました。

ということでサービスとインターフェイスの比較の観点からは、sheet["A1"]とsheet[0, 0]はセル、sheet[0:1, 0]はセル範囲となります。

UNO APIのメソッドの引数の型としてはsheet["A1"]はセル範囲になる


確認したのはXFunctionAccessのcallFunction()メソッドでだけです。


     ├─.sheet.XFunctionAccess
     │      any  callFunction( [in] string aName,
     │                         [in]  [any] aArguments
     │              ) raises ( .lang.IllegalArgumentException,
     │                         .container.NoSuchElementException)

このcallFunction()メソッドの引数は第一引数の型は文字列、第二引数はany型のタプルとなっています。

第二引数のタプルの要素はanyとなっていますが、APIリファレンスでは、long、double、stringか、それらのタプルのタプル、anyのタプルのタプル、そしてcom.sun.star.table.XCellRangeとなっています。

com.sun.star.table.XCellRangeはsheet["A1"]にも、sheet[0, 0]にも、sheet[0:1, 0]にも含まれているのでどれでもいけると思ったのですが、sheet[0, 0]だけはIllegalArgumentExceptionがでてきて、引数として渡せませんでした。

sheet["A1"]とsheet[0, 0]はサービスもインターフェイスも同じなのに、どうも納得できません。

sheet["A1"]とsheet[0, 0]の違いを見る方法を探してみましたが、文字列と出力したときの型以外にはわかりませんでした。
pyuno object (com.sun.star.table.XCellRange)0x9682944{implementationName=ScCellObj, supportedServices={com.sun.star.sheet.SheetCell,com.sun.star.table.Cell,com.sun.star.table.CellProperties,com.sun.star.style.CharacterProperties,com.sun.star.style.ParagraphProperties,com.sun.star.sheet.SheetCellRange,com.sun.star.table.CellRange}, supportedInterfaces={com.sun.star.beans.XPropertySet,com.sun.star.beans.XMultiPropertySet,com.sun.star.beans.XPropertyState,com.sun.star.sheet.XSheetOperation,com.sun.star.chart.XChartDataArray,com.sun.star.util.XIndent,com.sun.star.sheet.XCellRangesQuery,com.sun.star.sheet.XFormulaQuery,com.sun.star.util.XReplaceable,com.sun.star.util.XModifyBroadcaster,com.sun.star.lang.XServiceInfo,com.sun.star.lang.XUnoTunnel,com.sun.star.lang.XTypeProvider,com.sun.star.sheet.XCellRangeAddressable,com.sun.star.sheet.XSheetCellRange,com.sun.star.sheet.XArrayFormulaRange,com.sun.star.sheet.XArrayFormulaTokens,com.sun.star.sheet.XCellRangeData,com.sun.star.sheet.XCellRangeFormula,com.sun.star.sheet.XMultipleOperation,com.sun.star.util.XMergeable,com.sun.star.sheet.XCellSeries,com.sun.star.table.XAutoFormattable,com.sun.star.util.XSortable,com.sun.star.sheet.XSheetFilterableEx,com.sun.star.sheet.XSubTotalCalculatable,com.sun.star.table.XColumnRowRange,com.sun.star.util.XImportable,com.sun.star.sheet.XCellFormatRangesSupplier,com.sun.star.sheet.XUniqueCellFormatRangesSupplier,com.sun.star.table.XCell,com.sun.star.sheet.XCellAddressable,com.sun.star.text.XText,com.sun.star.container.XEnumerationAccess,com.sun.star.sheet.XSheetAnnotationAnchor,com.sun.star.text.XTextFieldsSupplier,com.sun.star.document.XActionLockable,com.sun.star.sheet.XFormulaTokens,com.sun.star.table.XCell2}}
pyuno object (com.sun.star.table.XCell)     0x9682944{implementationName=ScCellObj, supportedServices={com.sun.star.sheet.SheetCell,com.sun.star.table.Cell,com.sun.star.table.CellProperties,com.sun.star.style.CharacterProperties,com.sun.star.style.ParagraphProperties,com.sun.star.sheet.SheetCellRange,com.sun.star.table.CellRange}, supportedInterfaces={com.sun.star.beans.XPropertySet,com.sun.star.beans.XMultiPropertySet,com.sun.star.beans.XPropertyState,com.sun.star.sheet.XSheetOperation,com.sun.star.chart.XChartDataArray,com.sun.star.util.XIndent,com.sun.star.sheet.XCellRangesQuery,com.sun.star.sheet.XFormulaQuery,com.sun.star.util.XReplaceable,com.sun.star.util.XModifyBroadcaster,com.sun.star.lang.XServiceInfo,com.sun.star.lang.XUnoTunnel,com.sun.star.lang.XTypeProvider,com.sun.star.sheet.XCellRangeAddressable,com.sun.star.sheet.XSheetCellRange,com.sun.star.sheet.XArrayFormulaRange,com.sun.star.sheet.XArrayFormulaTokens,com.sun.star.sheet.XCellRangeData,com.sun.star.sheet.XCellRangeFormula,com.sun.star.sheet.XMultipleOperation,com.sun.star.util.XMergeable,com.sun.star.sheet.XCellSeries,com.sun.star.table.XAutoFormattable,com.sun.star.util.XSortable,com.sun.star.sheet.XSheetFilterableEx,com.sun.star.sheet.XSubTotalCalculatable,com.sun.star.table.XColumnRowRange,com.sun.star.util.XImportable,com.sun.star.sheet.XCellFormatRangesSupplier,com.sun.star.sheet.XUniqueCellFormatRangesSupplier,com.sun.star.table.XCell,com.sun.star.sheet.XCellAddressable,com.sun.star.text.XText,com.sun.star.container.XEnumerationAccess,com.sun.star.sheet.XSheetAnnotationAnchor,com.sun.star.text.XTextFieldsSupplier,com.sun.star.document.XActionLockable,com.sun.star.sheet.XFormulaTokens,com.sun.star.table.XCell2}}
pyuno object (com.sun.star.table.XCellRange)0x9682b7c{implementationName=ScCellRangeObj, supportedServices={com.sun.star.sheet.SheetCellRange,com.sun.star.table.CellRange,com.sun.star.table.CellProperties,com.sun.star.style.CharacterProperties,com.sun.star.style.ParagraphProperties}, supportedInterfaces={com.sun.star.beans.XPropertySet,com.sun.star.beans.XMultiPropertySet,com.sun.star.beans.XPropertyState,com.sun.star.sheet.XSheetOperation,com.sun.star.chart.XChartDataArray,com.sun.star.util.XIndent,com.sun.star.sheet.XCellRangesQuery,com.sun.star.sheet.XFormulaQuery,com.sun.star.util.XReplaceable,com.sun.star.util.XModifyBroadcaster,com.sun.star.lang.XServiceInfo,com.sun.star.lang.XUnoTunnel,com.sun.star.lang.XTypeProvider,com.sun.star.sheet.XCellRangeAddressable,com.sun.star.sheet.XSheetCellRange,com.sun.star.sheet.XArrayFormulaRange,com.sun.star.sheet.XArrayFormulaTokens,com.sun.star.sheet.XCellRangeData,com.sun.star.sheet.XCellRangeFormula,com.sun.star.sheet.XMultipleOperation,com.sun.star.util.XMergeable,com.sun.star.sheet.XCellSeries,com.sun.star.table.XAutoFormattable,com.sun.star.util.XSortable,com.sun.star.sheet.XSheetFilterableEx,com.sun.star.sheet.XSubTotalCalculatable,com.sun.star.table.XColumnRowRange,com.sun.star.util.XImportable,com.sun.star.sheet.XCellFormatRangesSupplier,com.sun.star.sheet.XUniqueCellFormatRangesSupplier}}
sheet["A1"]、sheet[0, 0]、sheet[0:1, 0]をそれぞれ文字列で出力してみました。

sheet["A1"]とsheet[0, 0]はサービスとインターフェイスが一致していますが、sheet["A1"]は型がcom.sun.star.table.XCellRangeなのに対して、sheet[0, 0]は型がcom.sun.star.table.XCellになっていました。

sheet[0:1, 0]は型がsheet["A1"]と同じcom.sun.star.table.XCellRangeになっています。

ということで、sheet["A1"]とsheet[0:1, 0]がcallFunction()メソッドの第二引数で渡せるのに、sheet[0, 0]が渡せない理由は、pyunoオブジェクトの型が原因とわかりました。

このpyuno objectの型を取得するメソッドを探してみましたが、それはわかりませんでした。

セルアクセス方法で取得できるセルとセル範囲の型


Calc(3)セルへのPythonのシーケンス型アクセス法でやったようにsheet["A1"]、sheet[0, 0]、sheet[0:1, 0]といったセルへのアクセス方法はLibreOffice5.1から導入されたものです。

MatthewFrancisPyUNO.pdf

このスライドを確認すると戻り値がセルの場合とセル範囲の場合についてちゃんと書いてありました。

sheet["Name"]は常にセル範囲が返ってきます、つまり型はcom.sun.star.table.XCellRangeです。

だけど、セルとしてのサービスとインターフェイスも備えています。

sheet[i, j]はどちらかの次元がスライスになっているときはセル範囲が返ってきますが、どちらもインデックスの場合はセルが返ってきます。

sheet[i, j]をどちらの次元もインデックスにして得られるセルのサービスとインターフェイスはsheet["Name"]と同じですが、型がcom.sun.star.table.XCellと異なります。

com.sun.star.table.XCell型のセルをcom.sun.star.table.XCellRange型のセルに変換する

def castToXCellRange(cell):  # セルをcom.sun.star.table.XCell型からcom.sun.star.table.XCellRange型に変換する。
 if cell.supportsService("com.sun.star.sheet.SheetCell"):  # 引数がセルのとき
  absolutename = cell.getPropertyValue("AbsoluteName")  # AbsoluteNameを取得。
  stringaddress = absolutename.split(".")[-1].replace("$", "")  # シート名を削除後$も削除して、セルの文字列アドレスを取得。
  sheet = cell.getSpreadsheet()  # セルのシートを取得。
  return sheet[stringaddress]  # com.sun.star.table.XCellRange型のセルを返す。
 else:
  raise RuntimeError("The argument of castToXCellRange() must be a cell.")
Calc(33)スプレッドシート関数をマクロで使うで、callFunction()メソッドの引数にセルを渡すときに、sheet[i, j]を渡せないので、com.sun.star.table.XCell型をcom.sun.star.table.XCellRange型に変換する関数を作成しました。

pyunoオブジェクトの型変換の普遍的な方法がわからないので、単純にインデックスでの取得を文字列アドレスで取得し直しているだけです。

参考にしたサイト


MatthewFrancisPyUNO.pdf
LibreOffice5.1から導入された新しいPyUNOの解説。

次の関連記事:Calc(33)スプレッドシート関数をマクロで使う

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ