2015-03-20 2 views
3

Я пытаюсь настроить общий CellStyles для формирования HSSFCells с использованием Apache-POI 3.11.Apache-POI: Cell Background Цвет не работает

Вот прогоняющий образец кода. Смелое и пограничное формирование правильное. Проблема связана с цветами фона и переднего плана.

Любая подсказка о том, что я делаю неправильно?

public class TestSO { 

private final static short 
     MY_LIGHT_BLUE=100, 
     MY_DARK_BLUE=101, 
     MY_BLACK=102, 
     MY_WHITE=103; 

public static void main(String[]args) throws Exception{ 
    HSSFWorkbook workbook = new HSSFWorkbook(); 
    setPallete(workbook.getCustomPalette()); 

    HSSFFont fontNormal = workbook.createFont(); 
    fontNormal.setFontHeightInPoints((short)11); 
    fontNormal.setFontName("Calibri"); 
    HSSFFont fontBold = workbook.createFont(); 
    fontBold.setFontHeightInPoints((short)11); 
    fontBold.setFontName("Calibri"); 
    fontBold.setBold(true); 


    HSSFCellStyle titleStyle = workbook.createCellStyle(); 
    titleStyle.setFillBackgroundColor(MY_DARK_BLUE); 
    titleStyle.setFillForegroundColor(MY_WHITE); 
    titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
    titleStyle.setFont(fontBold); 
    setTopBotBorder(titleStyle); 

    HSSFCellStyle fpStyle = workbook.createCellStyle(); 
    fpStyle.setFillBackgroundColor(MY_LIGHT_BLUE); 
    fpStyle.setFillForegroundColor(MY_BLACK); 
    fpStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
    fpStyle.setFont(fontNormal); 
    setTopBotBorder(fpStyle); 

    HSSFSheet sheet = workbook.createSheet("Leyenda"); 

    HSSFCell cell; 

    cell = sheet.createRow(1).createCell(1); 
    cell.setCellValue("TitleStyle"); 
    cell.setCellStyle(titleStyle); 

    cell = sheet.createRow(2).createCell(1); 
    cell.setCellValue("FpStyle"); 
    cell.setCellStyle(fpStyle); 

    sheet.autoSizeColumn(1); 

    try (FileOutputStream fos = new FileOutputStream(new File("TestWB.xls"))) { 
     workbook.write(fos); 
    } 
} 

private static void setPallete(HSSFPalette pallete){ 
    pallete.setColorAtIndex(MY_LIGHT_BLUE, (byte)189,(byte)215,(byte)238); 
    pallete.setColorAtIndex(MY_DARK_BLUE, (byte)32,(byte)55,(byte)100); 
    pallete.setColorAtIndex(MY_BLACK, (byte)0,(byte)0,(byte)0); 
    pallete.setColorAtIndex(MY_WHITE, (byte)255,(byte)255,(byte)255); 
} 

private static void setTopBotBorder(CellStyle style){ 
    style.setBorderBottom(CellStyle.BORDER_THIN); 
    style.setBottomBorderColor(MY_BLACK); 
    style.setBorderTop(CellStyle.BORDER_THIN); 
    style.setTopBorderColor(MY_BLACK); 
} 

}

Вот выходной файл Excel:

Program output

Спасибо заранее.

ответ

5

Я думаю, что есть пара вещей, которые вам нужно изменить. Во-первых, вы не можете просто назначать новые значения индексов для ваших пользовательских цветов. Паллета уже заполнена, поэтому вам нужно перезаписать существующие цвета своими собственными. Поэтому попробуйте изменить определение ваших двух блюза до:

private final static short MY_LIGHT_BLUE = HSSFColor.CORNFLOWER_BLUE.index, 
     MY_DARK_BLUE = HSSFColor.BLUE.index; 

Во-вторых, я никогда не ставил как на переднем плане и цвета фона в то же время, как это кажется конфликтовать. Для того, чтобы изменить цвет в ячейке, попробуйте просто установив цвет переднего плана, например:

HSSFCellStyle titleStyle = workbook.createCellStyle(); 
titleStyle.setFillForegroundColor(MY_DARK_BLUE); 
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
titleStyle.setFont(fontBold); 
setTopBotBorder(titleStyle); 

Если после этого вы хотите изменить цвет самого текста в ячейке, вы можете изменить цвет шрифта для пример:

fontNormal.setColor(HSSFColor.RED.index); 

Я проверил это и, похоже, сработал.

+0

Вот и все. Я забыл опубликовать разрешение, но моя ошибка предполагала «передний план» как цвет текста, когда правильный aproach - установить цвет fot. Btw, как только исправили настройку цвета, не было проблем с моими выбранными вручную цветовыми индексами. Спасибо, что ответили. – Netto

Смежные вопросы