echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Excella】Excella Repotsで、結合セルの値の取得・設定を行う方法

前回、「単一セルのExcella Reports上で書式・スタイルの設定を行う」方法を書きました。

しかし、結合セルの場合、前回記載した

Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
cell.setCellStyle(style);

のように、単純に(結合セルの一番左上の)行・列のインデックスを指定する方法では、対象の結合セルを取得できません。

そこで、結合セルの場合どうするか、というのが今回の内容です。

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.CellRangeAddress;
import org.apache.poi.ss.usermodel.Workbook;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;

public class SheetFormatSetter implements ReportProcessListener {
    
    public SheetFormatSetter() {
    }
    
    @Override
    public void postParse(Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {

        // sheetは、処理対象のシート。
        final int mergedCellCount = sheet.getNumMergedRegions();
        
        for(int i = 0; i < mergedCellCount; i++) {

            // シート内の各結合セルについて、左上のセルの行・列のインデックスを取得する。
            final CellRangeAddress range = sheet.GetMergedRegion(i);
            final int firstRow = range.getFirstRow();
            final int firstCol = range.getFirstColumn();

            // 結合セルの一番左上のセルを取得する。(値は一番左上のセルに設定されてるから)
            Row row = sheet.getRow(firstRow);
            Cell cell = row.getCell(firstCol);

            // セルの値の取得&設定。(ここまでくれば、あとは前回の内容と同じ)
            String value = cell.getStringCellValue();
            cell.setCellValue("new Value");
        }

        return;
    }

説明

ソースを見て、なんとなくわかった人も多いと思いますが、

  • (行・列のインデックス指定による結合セルの直接取得はでき)ないです。
  • (煩雑ですが、シート内の全ての結合セルを取得後、各結合セルの左上のセルを取得するという方法しか)ないです。
  • 結合セルの数は、SheetのgetNumMergedRegions()メソッドで取得できます。

という、ちょっと残念な結果になってしまいました。

注意点

  • 「特定のセル」を取得する際は、getFirstRow()やgetFirstColumn()の値に対して、ifなどでチェックをする必要があります。
  • GetMergedRegion(index)で取得できるセルは、indexを0, 1, 2...のように指定しても、「行の昇順、列の昇順」のように決まった順序で取得できるわけではないので注意です。*1

ということで、今回もExcella Reportsの記事でした。


実は、3月は完全にお休み...なので、1ヶ月まるまる休みです。でもいざ休みとなると、嬉しい反面、やっぱり不安もあったり。

...まあ、3月どころか、4月以降も全く未定なんですけどね...(お仕事のお話がありましたら、TwitterのDMなどで連絡をお願いします。)

*1:実際、ログにgetFirstRow()やgetFirstColumn()の値を記載してみましたが、てんでバラバラでした