倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

PoiBuilder で Quick Guide (18) :コメント

今回はセルにコメントをセットする (How to set cell comments) です(一覧)。

Java コード


セルにコメントを付加するサンプル。 結構、込み入ってます。

    Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();

    CreationHelper factory = wb.getCreationHelper();

    Sheet sheet = wb.createSheet();
    
    Rowl row  = sheet.createRow(3);
    Cell cell = row.createCell(5);
    cell.setCellValue("F4");
    
    Drawing drawing = sheet.createDrawingPatriarch();

    // When the comment box is visible, have it show in a 1x3 space
    ClientAnchor anchor = factory.createClientAnchor();
    anchor.setCol1(cell.getColumnIndex());
    anchor.setCol2(cell.getColumnIndex()+1);
    anchor.setRow1(row.getRowNum());
    anchor.setRow2(row.getRowNum()+3);

    // Create the comment and set the text+author
    Comment comment = drawing.createCellComment(anchor);
    RichTextString str = factory.createRichTextString("Hello, World!");
    comment.setString(str);
    comment.setAuthor("Apache POI");

    // Assign the comment to the cell
    cell.setCellComment(comment);

ややこしい理由は、いろいろなオブジェクトを生成する役割を担っているオブジェクトが2つあることでしょう:

  • CreationHelper オブジェクト --- Workbook オブジェクトから生成され、以下のオブジェクトを生成する
    • ClientAnchor オブジェクト --- コメントの描画領域を指定する(サンプルではセル単位で 1x3 のスペース)
    • RichTextString オブジェクト --- コメントの内容
  • Drawing オブジェクト --- Sheet オブジェクトから生成され、以下のオブジェクトを生成する
    • Comment オブジェクト --- コメントに対応するオブジェクト。 ClientAnchor, RichTextString オブジェクトがセットされる

以上によって生成された Comment オブジェクトがセルにセットされます。 実装の観点からするとこの手順も仕方ないのかも知れませんが、使う方にはかなり戸惑う仕様っす。

PoiBuilder による構築


上記の込み入った Java コードも PoiBuilder にかかればこの通り!

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.tools:poi-builder:0.0.5')

import org.waman.tools.poi.PoiBuilder

def workbook = new PoiBuilder().workbook{
    sheet{
        int i = 3, j = 5
        def anchor = clientAnchor(row1:i, row2:i+3, col1:j, col2:j+1)
        row(i){
            cell(j, cellValue:'F4',
                    cellComment:comment(anchor, string:richText('Hello, World!'), author:'Apache POI'))
        }
    }
}

ClientAnchor オブジェクトはコメントの描画領域を表すオブジェクトで、コメントを生成するのに必要なので自前で用意してもらう必要があります。 このオブジェクトは clientAnchor ノードによって生成できます。 ちょっと属性の設定が面倒ですが仕方なし。

Comment オブジェクトは comment ノードによって生成しますが、このとき先ほど生成した ClientAnchor オブジェクトを値として渡します。 コメントの内容は string 属性によって設定できますが、この属性に渡す値は RichTextString オブジェクトでなければなりません。 PoiBuilder では RichTextString は richTextString もしくは richText ノードによって生成できます*1

生成した Comment オブジェクトは cell ノードの cellComment 属性でセルにセットします。

作成されるスプレッドシート





「F4」と表示されているセルの、右上の赤い箇所にカーソルを合わせるとコメントが表示されます(LibreOffice では)。

追記


poi-builder 0.0.6 から、clientAnchor ノードで指定する範囲を row, column 属性によって指定できるようにしました。 これらは属性値として IntRange 値をとります:

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.tools:poi-builder:0.0.6')

import org.waman.tools.poi.SpreadsheetBuilder

def workbook = new SpreadsheetBuilder().workbook{
    sheet{
        int i = 3, j = 5
        row(i){
            def anchor = clientAnchor(row:i..i+3, column:j..j+1)
//          def anchor = clientAnchor(row1:i, row2:i+3, col1:j, col2:j+1) と同じ

            cell(j, cellValue:'F4',
                    cellComment:comment(anchor, string:richText('Hello, world!'), author:'Apache POI'))
        }
    }
}

かなり直感的に書けるようになったと思いませんか。

現場で使えるJavaライブラリ

現場で使えるJavaライブラリ


プログラミングGROOVY

プログラミングGROOVY

*1:フォントの設定などもできるようにしてますが、使い方は機会があれば。 まだちょっと動作不良ですが。