1

我尝试了在堆栈溢出上发布的不同解决方案,以将背景颜色应用于 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”实例有一些疑问:

代码调试器

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

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

4

2 回答 2

10

正如另一个答案所说,在自定义颜色时,需要使用setFillForegroundColor(XSSFColor color)而不是使用索引XSSFCellStyle颜色。但是也可以使用来自org.apache.poi.ss.usermodel.IndexedColorsXSSF的索引颜色。如果不需要使用自定义颜色,这将是最兼容的方式。

但也应该避免创建XSSFColorfrom 。java.awt.Color构造函数XSSFColor(java.awt.Color clr, IndexedColorMap map)被标记为“仅测试”。并且java.awt.Color在某些情况下不可用。

因此,如果需要“从十六进制代码设置单元格背景颜色”并且十六进制代码在 a 中String,则org.apache.commons.codec.binary.Hex可以用于从中获取byte[]数组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);
  }

 }
}
于 2019-10-29T07:45:28.777 回答
2

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

但是,您可以使用直接setFillForegroundColor采用XSSFColor.

cellStyle.setFillForegroundColor(bgColor);

当我使用这个重载时,我会得到你所期望的黄色作为背景。

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

于 2019-10-28T17:46:42.337 回答