Java ApachePOI4.1:从十六进制代码设置单元格背景颜色
我尝试过在stack overflow上发布不同的解决方案,将背景颜色应用于Apache POI生成的单元格,但没有任何效果 我在做一些事情,比如:Java ApachePOI4.1:从十六进制代码设置单元格背景颜色,java,spring,colors,apache-poi,apache-poi-4,Java,Spring,Colors,Apache Poi,Apache Poi 4,我尝试过在stack overflow上发布不同的解决方案,将背景颜色应用于Apache POI生成的单元格,但没有任何效果 我在做一些事情,比如: Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(sheetName); XSSFCellStyle cellStyle = ((XSSFCellStyle) workbook.createCellStyle()); if (styleObje
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中的颜色时,使用索引颜色效果不太好。默认情况下,XSSF工作簿中似乎没有任何颜色的索引,因此不能使用未索引的颜色索引 但是,您可以使用 当我使用这个重载时,我会得到你期望的黄色背景
通常,在XSSF中使用颜色时,应该使用XSSFColor本身,而不是其索引。这也适用于其他类型的颜色背景、边框颜色和字体颜色。我注意到,在xlsx文件XSSF中使用颜色时,使用索引颜色效果不佳。默认情况下,XSSF工作簿中似乎没有任何颜色的索引,因此不能使用未索引的颜色索引 但是,您可以使用 当我使用这个重载时,我会得到你期望的黄色背景
通常,在XSSF中使用颜色时,应该使用XSSFColor本身,而不是其索引。这也适用于其他情况,如其他图案颜色背景、边框颜色和字体颜色。另一个答案告诉我们,在XSSFCellStyle中,当涉及自定义颜色时,使用而不是使用索引颜色是必要的。但是在XSSF中也可以使用索引颜色。如果不需要使用定制的颜色,这将是最兼容的方式 但是也应该避免从java.awt.Color创建XSSFColor。构造函数标记为仅测试。在某些情况下,java.awt.Color将不可用 因此,如果需要从十六进制代码中设置单元格背景颜色,并且十六进制代码位于字符串中,则可以使用org.apache.commons.codec.binary.hex从该字符串获取字节[]数组。ApacheCommons编解码器已经是ApachePOI的依赖项之一。然后可以使用构造函数。IndexedColorMap到目前为止没有任何用途。因此可以将其设置为空。如果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);
}
}
}
另一个答案告诉我们,在XSSFCellStyle中,当涉及到自定义颜色时,使用而不是使用索引颜色是必要的。但是在XSSF中也可以使用索引颜色。如果不需要使用定制的颜色,这将是最兼容的方式 但是也应该避免从java.awt.Color创建XSSFColor。构造函数标记为仅测试。在某些情况下,java.awt.Color将不可用 因此,如果需要从十六进制代码中设置单元格背景颜色,并且十六进制代码位于字符串中,则可以使用org.apache.commons.codec.binary.hex从该字符串获取字节[]数组。ApacheCommons编解码器已经是ApachePOI的依赖项之一。然后可以使用构造函数。IndexedColorMap到目前为止没有任何用途。因此可以将其设置为空。如果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);
}
}
}
工作得很好!谢谢。是的,使用索引颜色不是很清楚,即使遵循api也很完美!谢谢。是的,使用索引颜色不是很清楚,即使遵循api docsLike Rgetman解决方案,即使我必须修复一些代码行,这也非常有效。实际上,我之所以选择这个作为解决方案,是因为它更加外向,涉及到代码的可维护性。请注意,我已经用string.replace从十六进制代码字符串FFF000中删除了char,就像rgetman解决方案一样,即使我必须修复一些代码行,它也能完美地工作。实际上,我之所以选择这个作为解决方案,是因为它更加外向,涉及到代码的可维护性。请注意,我已经用string.replace从十六进制代码字符串FFF000中删除了char,