今回はセルにコメントをセットする (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')) } } }
かなり直感的に書けるようになったと思いませんか。
- 作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司
- 出版社/メーカー: 翔泳社
- 発売日: 2011/07/16
- メディア: 大型本
- 購入: 6人 クリック: 217回
- この商品を含むブログ (20件) を見る
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (152件) を見る
*1:フォントの設定などもできるようにしてますが、使い方は機会があれば。 まだちょっと動作不良ですが。