Настройка нестандартного цвета фона не работает для XSSF в Apache POI
Я написал код, который должен создать файл Excel (xlsx или xls) и установить собственный цвет фона для ячейки. При создании файла xls цвет фона работает нормально, но в случае xlsx цвет фона не установлен на правильный цвет.
Что не так в моем коде?
public class PoiWriteExcelFile {
static Workbook workbook;
static Sheet worksheet;
public static void main(String[] args) {
try {
String type = "xlsx"; //xls
FileOutputStream fileOut = new FileOutputStream("D:\\poi-test." + type);
switch (type) {
case "xls":
workbook = new HSSFWorkbook();
break;
case "xlsx":
workbook = new XSSFWorkbook();
break;
}
CellStyle cellStyle = workbook.createCellStyle();
switch (type) {
case "xls":
HSSFPalette palette = ((HSSFWorkbook) workbook).getCustomPalette();
palette.setColorAtIndex(HSSFColor.LAVENDER.index, (byte)128, (byte)0, (byte)128);
HSSFColor hssfcolor = palette.getColor(HSSFColor.LAVENDER.index);
cellStyle.setFillForegroundColor(hssfcolor.getIndex());
break;
case "xlsx":
XSSFColor color = new XSSFColor(new java.awt.Color(128, 0, 128));
cellStyle.setFillForegroundColor(color.getIndex());
break;
}
worksheet = workbook.createSheet("POI Worksheet");
Row row1 = worksheet.createRow((short) 0);
Cell cellA1 = row1.createCell((short) 0);
cellA1.setCellValue("Hello");
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellA1.setCellStyle(cellStyle);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1 ответ
Вы пытаетесь использовать индексированный цвет, но с вашим кодом для HSSF индексированный цвет найден, но не для части XSSF. Там Color.getIndex()
вернет ноль, который черный.
Есть метод isIndexed()
на цвете, который вы должны проверить, если цвет индексируется, и только тогда имеет смысл использовать getIndex()
на POI-Color-объект.
Вы можете заставить его работать для XSSF, используя не индексированные цвета, а полное значение цвета, используя следующее:
((XSSFCellStyle)cellStyle).setFillForegroundColor(color);
Таким образом, вы установите реальный цвет, и полученная книга будет иметь правильный фон.