Apache POI で、Excelセルの背景色を読み取る

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("");

これは。背景色なしは、"" 空文字になる。