APACHE POI 4.1:从十六进制代码设置单元格背景颜色

APACHE POI 4.1 : Set cell background color from hex code

我尝试了堆栈溢出上发布的不同解决方案,以将背景颜色应用于 Apache POI 生成的单元格,但没有任何效果。

我在做类似的事情:

Workbook workbook = new XSSFWorkbook(); 
Sheet sheet = workbook.createSheet(sheetName);

XSSFCellStyle cellStyle = ((XSSFCellStyle) workbook.createCellStyle());

if (styleObject.getBgColor() != null) {
    java.awt.Color javaBdgColor = java.awt.Color.decode(voceStyle.getBgColor()); // this is #FFF000
    XSSFColor bgColor = new XSSFColor(javaBdgColor, new DefaultIndexedColorMap());
    cellStyle.setFillForegroundColor(bgColor.getIndex());
    cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}

Row newRow = Rowsheet.createRow(0);
Cell newCell = newRow.createCell(0);
newCell.setCellStyle(cellStyle);

// write file
String pathFileExport = buildPathExportFile("test-export");
FileOutputStream fileOut = new FileOutputStream(pathFileExport);
workbook.write(fileOut);
fileOut.close();

//close workbook
workbook.close();

return Paths.get(pathFileExport);

我认为我的代码中的一切都很好,但是像这样设置样式的每个单元格都会导致黑色背景。

我对 "DefaultIndexedColorMap" 在调试结果期间没有字段的实例有一些疑问:

在这一点上,我不确定该怎么做才能解决。 其他帖子中的每个人似乎都能正常工作,但我的背景仍然是深色而不是黄色。

有什么建议吗? 提前致谢!

我注意到在 xlsx 文件 (XSSF) 中处理颜色时,使用索引颜色效果不是很好。默认情况下,XSSFWorkbook 中的任何颜色似乎都没有索引,因此您不能使用未编入索引的颜色索引。

但是,您可以使用 overload of setFillForegroundColor that directly takes an XSSFColor

cellStyle.setFillForegroundColor(bgColor);

当我使用这个重载时,我得到了黄色作为背景,正如您所期望的那样。

通常在 XSSF 中处理颜色时,您应该使用 XSSFColor 本身而不是它的索引。这适用于其他颜色,例如其他图案颜色 ("background")、边框颜色和字体颜色。

正如另一个答案所说,setFillForegroundColor(XSSFColor color) instead of using indexed colors is necessary in XSSFCellStyle when it comes to customized colors. But usage of indexed colors from org.apache.poi.ss.usermodel.IndexedColors 也可以在 XSSF 中使用。如果不需要使用自定义颜色,这将是最兼容的方式。

但也应避免从 java.awt.Color 创建 XSSFColor。构造函数 XSSFColor(java.awt.Color clr, IndexedColorMap map) 被标记为 "TEST ONLY"。并且 java.awt.Color 在某些情况下将不可用。

所以如果需要 "set cell background color from hex code" 并且十六进制代码在 String 中,那么 org.apache.commons.codec.binary.Hex 可以用来从那个 StringApache commons codec 已经是 apache poi 的依赖项之一。然后可以使用构造函数XSSFColor(byte[] rgb, IndexedColorMap colorMap)IndexedColorMap 到现在为止没有用处。所以可以设置null。如果 IndexedColorMap 以后有任何使用,那么无论如何都必须调整代码。

示例:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import org.apache.commons.codec.binary.Hex;

class CreateXSSFColor {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   String rgbS = "FFF000";
   byte[] rgbB = Hex.decodeHex(rgbS); // get byte array from hex string
   XSSFColor color = new XSSFColor(rgbB, null); //IndexedColorMap has no usage until now. So it can be set null.

   XSSFCellStyle cellStyle = (XSSFCellStyle) workbook.createCellStyle();
   cellStyle.setFillForegroundColor(color);
   cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

   Sheet sheet = workbook.createSheet(); 
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   cell.setCellValue("yellow");
   cell.setCellStyle(cellStyle);

   workbook.write(fileout);
  }

 }
}