无法在 XSSFCell Apache POI 中设置自定义颜色

Not able to set custom color in XSSFCell Apache POI

我正在尝试将一些自定义(从十六进制代码或 rgb 值)颜色设置为 xssfcell.But 单元格的颜色正在变成黑色,即使我正在给其他 color.I 尝试做通过以下方式:

File xlSheet = new File("C:\Users\IBM_ADMIN\Downloads\Excel Test\Something3.xlsx");
    System.out.println(xlSheet.createNewFile());
    FileOutputStream fileOutISPR = new FileOutputStream("C:\Users\IBM_ADMIN\Downloads\Excel Test\Something3.xlsx");
    XSSFWorkbook isprWorkbook = new XSSFWorkbook();
    XSSFSheet sheet = isprWorkbook.createSheet("TEST");
    XSSFRow row = sheet.createRow(0);
    XSSFCellStyle cellStyle = isprWorkbook.createCellStyle();
    byte[] rgb = new byte[3];
    rgb[0] = (byte) 24; // red
    rgb[1] = (byte) 22; // green
    rgb[2] = (byte) 219; // blue
    XSSFColor myColor = new XSSFColor(rbg);
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    XSSFCell cell = row.createCell(0);
    cell.setCellValue("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has");
    cell.setCellStyle(cellStyle);
    CellRangeAddress rangeAddress = new CellRangeAddress(0, 0, 0, 2);
    sheet.addMergedRegion(rangeAddress);
    int width = ((int)(90 * 0.73)) * 256;
    sheet.setColumnWidth(cell.getColumnIndex(), width);
    //sheet.autoSizeColumn(cell.getColumnIndex());
    RegionUtil.setBorderBottom(XSSFCellStyle.BORDER_MEDIUM, rangeAddress, sheet, isprWorkbook);
    RegionUtil.setBottomBorderColor(IndexedColors.RED.getIndex(), rangeAddress, sheet, isprWorkbook);

    XSSFCell cell2 = row.createCell(11);
    cell2.setCellValue("222222222222222");
    isprWorkbook.write(fileOutISPR);

//程序结束

   XSSFCellStyle cellStyle = isprWorkbook.createCellStyle();
   byte[] rgb = new byte[3];
    rgb[0] = (byte) 24; // red
    rgb[1] = (byte) 22; // green
    rgb[2] = (byte) 219; // blue
    XSSFColor myColor = new XSSFColor(rgb);
    cellStyle.setFillForegroundColor(myColor);//1st method
    //cellStyle.setFillForegroundColor(new XSSFColor(new   java.awt.Color(128, 0, 128)));//2nd method  
  //XSSFColor myColor = new XSSFColor(Color.decode("0XFFFFFF"));
  cellStyle.setFillForegroundColor(myColor);//3rd Method

我尝试了相关问题答案中提到的许多其他方法,但其中 none 解决了我的问题。 请帮帮我。

这是由于 Package org.apache.poi.ss.util 的不完整造成的。

PropertyTemplate以及CellUtilRegionUtil仅基于ss.usermodel级别而不是xssf.usermodel级别。但是 org.apache.poi.ss.usermodel.CellStyle 直到现在才对 setFillForegroundColor(Color color) 有所了解。它只知道setFillForegroundColor(short bg)。所以 ss.usermodel 级别直到现在都无法将 Color 设置为填充前景色。只有 short(颜色索引)是可能的。

如果涉及到为什么在使用 org.apache.poi.ss.util 只设置边框时需要设置颜色的问题,那么答案是,这是必要的,因为颜色和边框都在同一个 CellStyle。这就是为什么将边框设置添加到 CellStyle 时,必须保持颜色设置并最终设置新的颜色设置。

所以总而言之,没有办法摆脱这种困境。如果您需要使用 org.apache.poi.ss.util,那么您不能同时使用 setFillForegroundColor(XSSFColor color)。唯一的希望就是setFillForegroundColor(Color color)apache poi以后的版本中加入org.apache.poi.ss.usermodel.CellStyle

作为解决方法,您可以在使用单元格样式设置所有其他格式选项(对齐、边框...)后使用条件格式来设置自定义颜色。

这是一个工作 (Kotlin) 示例,它定义了自定义颜色以区分偶数行和奇数行:

private fun setEvenOddColorFormatting(sheet: XSSFSheet) {
            val sheetConditionalFormatting = sheet.sheetConditionalFormatting

            val rule = sheetConditionalFormatting.createConditionalFormattingRule("MOD(ROW(), 2) = 0")
            val formatForRule = rule.createPatternFormatting()
            formatForRule.setFillBackgroundColor(XSSFColor(byteArrayOf(221.toByte(), 235.toByte(), 247.toByte())))
            formatForRule.fillPattern = PatternFormatting.SOLID_FOREGROUND

            val region = arrayOf(CellRangeAddress(0, sheet.lastRowNum,0,10))
            sheetConditionalFormatting.addConditionalFormatting(region, rule)
        }

一个缺点是,您必须将规则编写为 excel 函数。但是你应该能够使用一个始终为真的函数并且只设置区域。