Apache POI, создавая новые ячейки, переопределяет стиль строки

Я использую POI Apache для экспорта данных в файл .xlsx, и я хочу создать некоторые из строк и ячеек, содержащихся в файле.

Я использую XSSF, так как файл будет прочитан в Excel 2007 +.

В основном, моя проблема в том, что я пытаюсь установить стиль строки, как в следующем примере, который устанавливает черный цвет переднего плана для всей строки в индексе 0. Он отлично работает, но всякий раз, когда я создаю новую ячейку, вновь созданная ячейка не имеет стиля, как если бы она перекрывала стиль строки, который я указал.

Вот фрагмент кода, чтобы продемонстрировать, что я делаю:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("mySheet");
XSSFRow row = sheet.createRow(0);

XSSFCellStyle myStyle = wb.createCellStyle();           

myStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255)));
myStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

row.setRowStyle(myStyle); //This works, the whole row is now black

row.createCell(0); // This cell doesn't have a style, the rest of the line stays stylized
row.getCell(0).setCellValue("Test");

Я также пробовал * row.createCell(0, Cell.CELL_TYPE_STRING); *, но ничего не изменил.

Каков правильный способ выполнения того, что я хочу сделать? Я хотел сделать это таким образом, поэтому мне не нужно было устанавливать каждый стиль ячейки после его создания, поскольку все ячейки в одной строке имеют один и тот же стиль.

Ответ 1

Установите стиль во вновь созданную ячейку, например, например. ниже:

    XSSFCell newCell = row.createCell(0);
    newCell.setCellStyle(myStyle);

Ответ 2

Даже вы создаете строку со стилем, она не будет влиять на созданную ячейку. Созданная ячейка имеет свой собственный стиль ячейки. row style не будет автоматически заменяться на cell style. Если вы хотите использовать стиль строки в ячейке, вам нужно снова установить его.

Даже если вы установите row style в конце, это не повлияет на ячейку.

Пример

CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
Row r = sheet.createRow(0);
r.setRowStyle(rowStyle);

Cell c1 = r.createCell(0);
c1.setCellValue("Test 1");
c1.setCellStyle(rowStyle);

Ответ 3

Я согласен, что "setRowStyle" не работает так, как должно быть.

Я создал свою собственную функцию для применения стиля к диапазону (может быть строкой или несколькими строками)

public void applyStyleToRange(Sheet sheet, CellStyle style, int rowStart, int colStart, int rowEnd, int colEnd) {
    for (int r = rowStart; r <= rowEnd; r++) {
        for (int c = colStart; c <= colEnd; c++) {
            Row row = sheet.getRow(r);

            if (row != null) {
                Cell cell = row.getCell(c);

                if (cell != null) {
                    cell.setCellStyle(style);
                }
            }
        }
    }
}