Apache POI 5.2.3中HSSFWorkbook单元格背景色设置问题
Apache POI 5.2.3 HSSFWorkbook 用十六进制颜色设置单元格背景色
在HSSFWorkbook(.xls格式)中,单元格颜色依赖内置调色板,无法直接像XSSF那样传入RGB值。要使用十六进制颜色,需先将其转换为RGB,再通过调色板关联到颜色索引,具体实现如下:
步骤1:十六进制转RGB
先把十六进制颜色码转换为RGB数值,比如C0C0C0对应RGB(192,192,192),可以用工具方法实现转换:
private static int[] hexToRgb(String hexColor) { // 移除可能存在的#前缀 String cleanHex = hexColor.replace("#", ""); int red = Integer.parseInt(cleanHex.substring(0, 2), 16); int green = Integer.parseInt(cleanHex.substring(2, 4), 16); int blue = Integer.parseInt(cleanHex.substring(4, 6), 16); return new int[]{red, green, blue}; }
步骤2:通过调色板关联颜色索引
HSSF的调色板有56个颜色索引(0-55),其中0-7是系统默认颜色,建议从索引8开始替换未使用的颜色,避免影响默认样式,可通过两种方式处理:
方式一:查找调色板中已有的相似颜色
使用findSimilarColor方法匹配最接近的颜色,直接复用其索引:
HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Demo"); HSSFCell cell = sheet.createRow(0).createCell(0); cell.setCellValue("自定义背景色"); // 十六进制颜色转换为RGB int[] rgb = hexToRgb("C0C0C0"); // 获取调色板 HSSFPalette palette = workbook.getCustomPalette(); // 查找相似颜色 HSSFColor targetColor = palette.findSimilarColor(rgb[0], rgb[1], rgb[2]);
方式二:强制替换调色板索引
如果找不到匹配的相似颜色,或者需要精确颜色,可以直接替换一个调色板索引:
// 替换索引8(可选择其他未使用的索引,范围8-55) palette.setColorAtIndex((short)8, (byte)rgb[0], (byte)rgb[1], (byte)rgb[2]); HSSFColor targetColor = palette.getColor((short)8);
步骤3:设置单元格样式并应用
创建单元格样式,设置填充颜色和填充模式,最后应用到单元格:
HSSFCellStyle cellStyle = workbook.createCellStyle(); // 设置前景填充色(HSSF中背景色通过前景填充色设置) cellStyle.setFillForegroundColor(targetColor.getIndex()); // 必须设置填充模式为实心,否则颜色不显示 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 应用样式到单元格 cell.setCellStyle(cellStyle); // 写入文件 try (FileOutputStream fos = new FileOutputStream("custom-color.xls")) { workbook.write(fos); } catch (IOException e) { e.printStackTrace(); }
注意事项
- HSSF调色板最多支持56种颜色,若需要多个自定义颜色,需依次替换不同的未使用索引;
- 0-7为系统默认颜色,修改可能导致其他依赖默认颜色的样式异常;
- 必须设置
FillPatternType.SOLID_FOREGROUND,否则背景色不会生效。
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

