Настройка нестандартного цвета фона не работает для 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);

Таким образом, вы установите реальный цвет, и полученная книга будет иметь правильный фон.

Другие вопросы по тегам