无法在 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
以及CellUtil
和RegionUtil
仅基于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 函数。但是你应该能够使用一个始终为真的函数并且只设置区域。
我正在尝试将一些自定义(从十六进制代码或 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
以及CellUtil
和RegionUtil
仅基于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 函数。但是你应该能够使用一个始终为真的函数并且只设置区域。