POI で、Excelセルの背景色を設定するのは、
org.apache.poi.ss.usermodel.Workbook から、org.apache.poi.ss.usermodel.CellStyle の
インスタンスを生成して、
→ Workbook の createCellStyle() メソッド
org.apache.poi.ss.usermodel.IndexedColors で表す列挙型、IndexedColors.YELLOW などを
CellStyle の setFillForegroundColor でセットして
CellStyle の setFillPattern で、塗りつぶしパターン、FillPatternType.SOLID_FOREGROUND などを
設定すれば良いのだが、
セルの背景色を読み込んだ時に、IndexedColors の列挙型に該当するものまでを取得できるメソッドは
存在しない。
RGB値を取得することぐらいしか方法がない。
org.apache.poi.ss.usermodel.Cell から、CellStyle を求めて
getFillForegroundColorColor() で、org.apache.poi.ss.usermodel.Color インスタンスを求める
CellStyle cellstyle = cell.getCellStyle();
ここから、org.apache.poi.ss.usermodel.Color を求めるのだが、
Color color = cellstyle.getFillForegroundColorColor();
セルに背景色が設定されていなければ、これは null である。
この Color インターフェース自体は、何もない宣言だけのインターフェースで、
org.apache.poi.xssf.usermodel.XSSFColor にキャストしないと、
RGB 16進数を取得する getRGB() メソッドを使用できない。
byte[] rgbBytes = ((XSSFColor)color).getRGB();
byte[] のままでは、使い勝手が悪いのでこれを 16進数文字列表現にする。
→ 方法はいろいろあるでしょう。
配列なので、Arrays.stream で 16進数 "%02x" に変換して join すればと短絡的に
思いつくけど、byte[ ] を処理できるわけがなく、、
byte[] を IntStream で、、、 - Oboe吹きプログラマの黙示録
で書いたように、ByteArrayInputStream として、IntStream の generate で処理する。
まとめると、、、
CellStyle cellstyle = cell.getCellStyle(); String rgbString = Optional.ofNullable(cellstyle.getFillForegroundColorColor()) .map(XSSFColor.class::cast) .map(c->{ ByteArrayInputStream binst = new ByteArrayInputStream(c.getRGB()); return IntStream.generate(binst::read).limit(binst.available()) .mapToObj(i->String.format("%02x", i)) .collect(Collectors.joining()); }).orElse("");
これは。背景色なしは、"" 空文字になる。