2017年8月12日土曜日

29: スプレッドシートの行領域、列領域、セル群四角領域を挿入したり削除したりする

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

Main body START

LibreOfficeまたはApache OpenOfficeのCalcスプレッドシートを拡張機能を通してJavaまたはマクロプログラムから操作する(読むまたは書く)方法を知る

スプレッドシートの行範囲または列範囲をどのように挿入できるか?

-Hypothesizer

別の頻繁に遭遇するユースケースとして、スプレッドシートの行および列の範囲を挿入および削除することがあるだろう。

-Rebutter

そうだろうね。同じことを、スプレッドシートのセルデータを移動および削除することでも達成できるが、多くのセルにデータがある場合、それは面倒すぎるし、遅すぎるだろう。

-Hypothesizer

そうだろう。

スプレッドシートUNOオブジェクトのUNOコンポーネントは、UNOインターフェース、'com.sun.star.sheet.XCellRangeMovement'を実装しており、これによって、スプレッドシートの行範囲や列範囲を挿入および削除できる。

-Rebutter

なるほど。

-Hypothesizer

行範囲および列範囲は、このUNOインターフェースの'insertCells'メソッドを呼ぶことで挿入できる。

-Rebutter

ふむ?'insertCells'?行範囲や列範囲よりももっと一般的な形のセルグループを挿入できるかのように聞こえる名前だ。

-Hypothesizer

事実、四角なセル群領域を挿入することができる。

-Rebutter

ふーむ、すると、四角領域がシートに挿入されて、それで、シートの残りの部分はどうなる?

-Hypothesizer

既存の指定された領域とその右側を右に移動させるか、既存の指定された領域とその下側を下に移動させることができる。

-Rebutter

それでは、そのどちらかを指定できるのか?

-Hypothesizer

そう。それは我々の関心事ではなかったが、それもあとで試してみよう。

-Rebutter

オーケー。

-Hypothesizer

このメソッドは2つの引数を取る。挿入するべき領域と挿入のモードだ。 第1の引数はstruct(Javaではクラスにマッピングされる)だ。行領域を挿入する時は、シートのインデックス、挿入する領域の開始行インデックスおよび終了行インデックスを指定する。第2の引数はenum(Javaではクラスにマッピングされる)だ。行領域を挿入する時は、'com.sun.star.sheet.CellInsertMode.ROWS'を指定する。

-Rebutter

ははあ。

-Hypothesizer

列領域を挿入する時は、シートのインデックス、挿入する領域の開始列インデックスおよび終了列インデックス、'com.sun.star.sheet.CellInsertMode.COLUMNS'を指定する。

-Rebutter

このstructはそれら5つのメンバーを持っているわけだ。例えば、行領域を挿入する時、他の意味のないメンバーには特定の値をセットしなければならないのか?

-Hypothesizer

いや、そうではない。意味のないメンバーはただ無視される。

-Rebutter

なるほど。

スプレッドシートの行範囲または列範囲をどのように削除できるか?

-Hypothesizer

行範囲および列範囲は、先程のUNOインターフェースの'removeRange'メソッドを呼ぶことで削除できる。

-Rebutter

ああ、これも四角なセル群領域を操作できるわけだ。

-Hypothesizer

そうだ。指定された領域の右側を左に移動させるか、指定された領域の下側を上に移動させることができる。

-Rebutter

なるほど。

-Hypothesizer

このメソッドは2つの引数を取る。削除するべき領域と削除のモードだ。 第1の引数は先程と同じstructだ。行領域を削除する時は、シートのインデックス、削除する領域の開始行インデックスおよび終了行インデックスを指定する。第2の引数は別のenumだ。行領域を削除する時は、'com.sun.star.sheet.CellDeleteMode.ROWS'を指定する。

-Rebutter

ははあ。

-Hypothesizer

列領域を削除する時は、シートのインデックス、削除する領域の開始列インデックスおよび終了列インデックス、'com.sun.star.sheet.CellDeleteMode.COLUMNS'を指定する。

-Rebutter

なるほど。

スプレッドシートのセル群四角領域をどのように挿入または削除できるか?

-Hypothesizer

セル群四角領域を挿入するには、第1引数に、シートのインデックス、挿入する領域の開始行インデックス、終了行インデックス、開始列インデックス、終了列インデックスを指定する。第2引数には、既存の指定された領域とその右側を右に移動させるには、'com.sun.star.sheet.CellInsertMode.RIGHT'を指定する。既存の指定された領域とその下側を下に移動させるには、'com.sun.star.sheet.CellInsertMode.DOWN'を指定する。

-Rebutter

ははあ。

-Hypothesizer

セル群四角領域を削除するには、第1引数に、シートのインデックス、削除する領域の開始行インデックス、終了行インデックス、開始列インデックス、終了列インデックスを指定する。第2引数には、指定された領域の右側を左に移動させるには、'com.sun.star.sheet.CellDeleteMode.LEFT'を指定する。指定された領域の下側を上に移動させるには、'com.sun.star.sheet.CellDeleteMode.UP'を指定する。

-Rebutter

なるほど。

-Hypothesizer

結局、前記事のコードの後に以下のコードを書いた。

   XCellRangeMovement l_currentSpreadSheetInXCellRangeMovement = (XCellRangeMovement) UnoRuntime.queryInterface (XCellRangeMovement .class, l_currentSpreadSheet );
   CellRangeAddress l_cellRangeAddress = new CellRangeAddress ();
   l_cellRangeAddress.Sheet = (short) 2;
   l_cellRangeAddress.StartRow = 17;
   l_cellRangeAddress.EndRow = 18;
   l_currentSpreadSheetInXCellRangeMovement. insertCells (l_cellRangeAddress, CellInsertMode.ROWS);
   l_cellRangeAddress.StartColumn = 3;
   l_cellRangeAddress.EndColumn = 3;
   l_currentSpreadSheetInXCellRangeMovement. insertCells (l_cellRangeAddress, CellInsertMode.COLUMNS);
   l_cellRangeAddress.StartRow = 24;
   l_cellRangeAddress.EndRow = 25;
   l_currentSpreadSheetInXCellRangeMovement. removeRange (l_cellRangeAddress, CellDeleteMode.ROWS);
   l_cellRangeAddress.StartColumn = 8;
   l_cellRangeAddress.EndColumn = 9;
   l_currentSpreadSheetInXCellRangeMovement. removeRange (l_cellRangeAddress, CellDeleteMode.COLUMNS);
   l_cellRangeAddress.StartRow = 36;
   l_cellRangeAddress.EndRow = 37;
   l_cellRangeAddress.StartColumn = 2;
   l_cellRangeAddress.EndColumn = 3;
   l_currentSpreadSheetInXCellRangeMovement. insertCells (l_cellRangeAddress, CellInsertMode.RIGHT);
   l_cellRangeAddress.StartRow = 41;
   l_cellRangeAddress.EndRow = 42;
   l_cellRangeAddress.StartColumn = 2;
   l_cellRangeAddress.EndColumn = 3;
   l_currentSpreadSheetInXCellRangeMovement. insertCells (l_cellRangeAddress, CellInsertMode.DOWN);
   l_cellRangeAddress.StartRow = 36;
   l_cellRangeAddress.EndRow = 37;
   l_cellRangeAddress.StartColumn = 2;
   l_cellRangeAddress.EndColumn = 3;
   l_currentSpreadSheetInXCellRangeMovement. removeRange (l_cellRangeAddress, CellDeleteMode.LEFT);
   l_cellRangeAddress.StartRow = 41;
   l_cellRangeAddress.EndRow = 42;
   l_cellRangeAddress.StartColumn = 2;
   l_cellRangeAddress.EndColumn = 3;
   l_currentSpreadSheetInXCellRangeMovement. removeRange (l_cellRangeAddress, CellDeleteMode.UP);

以下のインポート命令も追加した。

import com.sun.star.sheet.XCellRangeMovement;
import com.sun.star.table.CellRangeAddress;
import com.sun.star.sheet.CellInsertMode;
import com.sun.star.sheet.CellDeleteMode;
-Rebutter

なるほど。

Main body END

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>