<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
LibreOfficeまたはApache OpenOfficeのCalcスプレッドシートを拡張機能を通してJavaまたはマクロプログラムから操作する(読むまたは書く)方法を知る
別の頻繁に遭遇するユースケースとして、スプレッドシートの行および列の範囲を挿入および削除することがあるだろう。
そうだろうね。同じことを、スプレッドシートのセルデータを移動および削除することでも達成できるが、多くのセルにデータがある場合、それは面倒すぎるし、遅すぎるだろう。
そうだろう。
スプレッドシートUNOオブジェクトのUNOコンポーネントは、UNOインターフェース、'com.sun.star.sheet.XCellRangeMovement'を実装しており、これによって、スプレッドシートの行範囲や列範囲を挿入および削除できる。
なるほど。
行範囲および列範囲は、このUNOインターフェースの'insertCells'メソッドを呼ぶことで挿入できる。
ふむ?'insertCells'?行範囲や列範囲よりももっと一般的な形のセルグループを挿入できるかのように聞こえる名前だ。
事実、四角なセル群領域を挿入することができる。
ふーむ、すると、四角領域がシートに挿入されて、それで、シートの残りの部分はどうなる?
既存の指定された領域とその右側を右に移動させるか、既存の指定された領域とその下側を下に移動させることができる。
それでは、そのどちらかを指定できるのか?
そう。それは我々の関心事ではなかったが、それもあとで試してみよう。
オーケー。
このメソッドは2つの引数を取る。挿入するべき領域と挿入のモードだ。 第1の引数はstruct(Javaではクラスにマッピングされる)だ。行領域を挿入する時は、シートのインデックス、挿入する領域の開始行インデックスおよび終了行インデックスを指定する。第2の引数はenum(Javaではクラスにマッピングされる)だ。行領域を挿入する時は、'com.sun.star.sheet.CellInsertMode.ROWS'を指定する。
ははあ。
列領域を挿入する時は、シートのインデックス、挿入する領域の開始列インデックスおよび終了列インデックス、'com.sun.star.sheet.CellInsertMode.COLUMNS'を指定する。
このstructはそれら5つのメンバーを持っているわけだ。例えば、行領域を挿入する時、他の意味のないメンバーには特定の値をセットしなければならないのか?
いや、そうではない。意味のないメンバーはただ無視される。
なるほど。
行範囲および列範囲は、先程のUNOインターフェースの'removeRange'メソッドを呼ぶことで削除できる。
ああ、これも四角なセル群領域を操作できるわけだ。
そうだ。指定された領域の右側を左に移動させるか、指定された領域の下側を上に移動させることができる。
なるほど。
このメソッドは2つの引数を取る。削除するべき領域と削除のモードだ。 第1の引数は先程と同じstructだ。行領域を削除する時は、シートのインデックス、削除する領域の開始行インデックスおよび終了行インデックスを指定する。第2の引数は別のenumだ。行領域を削除する時は、'com.sun.star.sheet.CellDeleteMode.ROWS'を指定する。
ははあ。
列領域を削除する時は、シートのインデックス、削除する領域の開始列インデックスおよび終了列インデックス、'com.sun.star.sheet.CellDeleteMode.COLUMNS'を指定する。
なるほど。
セル群四角領域を挿入するには、第1引数に、シートのインデックス、挿入する領域の開始行インデックス、終了行インデックス、開始列インデックス、終了列インデックスを指定する。第2引数には、既存の指定された領域とその右側を右に移動させるには、'com.sun.star.sheet.CellInsertMode.RIGHT'を指定する。既存の指定された領域とその下側を下に移動させるには、'com.sun.star.sheet.CellInsertMode.DOWN'を指定する。
ははあ。
セル群四角領域を削除するには、第1引数に、シートのインデックス、削除する領域の開始行インデックス、終了行インデックス、開始列インデックス、終了列インデックスを指定する。第2引数には、指定された領域の右側を左に移動させるには、'com.sun.star.sheet.CellDeleteMode.LEFT'を指定する。指定された領域の下側を上に移動させるには、'com.sun.star.sheet.CellDeleteMode.UP'を指定する。
なるほど。
結局、前記事のコードの後に以下のコードを書いた。
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;
なるほど。