Java Apache POI — XSSFCell setFillBackgroundColor не имеет эффекта

Я просмотрел все переполнение стека и, похоже, не смог заставить свой java-код заполнить цвет фона ячейки XSSF excel. Судя по тому, что говорили другие, это должно сделать ячейку в верхнем левом углу желтой:

// Example Code
try {

    // prepare
    FileInputStream resource = new FileInputStream( FILEPATH + FILENAME );
    XSSFWorkbook workbook = new XSSFWorkbook( resource );
    XSSFSheet sheet = workbook.createSheet( "Example Sheet" );

    // create
    XSSFRow row = sheet.createRow( 0 );
    XSSFCell cell = row.createCell( 0 );
    XSSFCellStyle style = workbook.createCellStyle();
    XSSFColor color = new XSSFColor( Color.YELLOW );

    // stylize
    style.setFillBackgroundColor( color );
    cell.setCellStyle( style );

    // finalize
    FileOutputStream output = new FileOutputStream( "Example Workbook.xlsx" );
    workbook.write( output );
    workbook.close();

} catch ( Exception e ) {

    // error
    e.printStackTrace();

}

... но это не так. Может кто-нибудь сообщить мне, что я делаю неправильно? Кстати, я использую Apache POI версии 3.16.

Спасибо!


person Ibrahim    schedule 06.08.2017    source источник
comment
Закройте output   -  person Ivan Pronin    schedule 06.08.2017


Ответы (1)


Три свойства CellStyle определяют, как заполняется ячейка:

  • ЗаполнитьШаблон
  • ЗаливкаПереднего планаЦвет
  • ЗаполнитьФонЦвет

В большинстве шаблонов заливки, таких как FillPatternType.BIG_SPOTS, используются оба цвета. Название FillForegroundColor вводит в заблуждение, но его можно понять. Это цвет переднего плана узора заливки, который все еще находится на заднем плане ячейки.

Чтобы заполнить ячейку одним цветом, вам нужно использовать FillPatternType.SOLID_FOREGROUND, который использует цвет переднего плана. Итак, вам нужно изменить код следующим образом:

// stylize
style.setFillForegroundColor(color);
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);
person r0the    schedule 06.08.2017
comment
Все верно, кроме дополнительного постскриптума о закрытии выходного потока, так как workbook.close(); уже это делает. - person Axel Richter; 07.08.2017
comment
Спасибо, не знал, удалил постскриптум. - person r0the; 07.08.2017