Aplicar cores e bordas de preenchimento ao intervalo do Excel usando o Apache POI

Estou trabalhando na conversão de umExcel VBA Script paraJava usandoApache POI e eu estou preso. No VBA, é fácil aplicar cores de preenchimento e bordas às células em sucessão. Mas no POI parece quase impossível sem criar centenas deXSSFCellStyles [(Todas as cores usadas) x (Todas as combinações de bordas) x (Todas as fontes usadas)]. Estou tentando recriar esta planilha, que atualmente é produzida via VBA:Imagem da planilha

O código abaixo pretende iniciar a formatação preenchendo as duas linhas superiores em cinza e adicionando as bordas externas. Dividi o código em três classes (desculpe qualquer código incorreto ou erros noob. Ainda na semana 2 de aprendizado de Java):

Classe principal:

public class CreateExcel {

public static void createExcel(String[] args) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet resultsSheet = workbook.createSheet("Results");
ExcelMethods format = new ExcelMethods();
ExcelStyles style = new ExcelStyles();

format.formatRange(workbook, resultsSheet, style.fillPMEDarkGray(workbook), 1, 2, 2, 14);
format.formatRange(workbook, resultsSheet, style.borderLeft(workbook), 1, 2, 2, 1);
format.formatRange(workbook, resultsSheet, style.borderRight(workbook), 1, 2, 16, 1);
format.formatRange(workbook, resultsSheet, style.borderTop(workbook), 1, 1, 2, 14);
format.formatRange(workbook, resultsSheet, style.borderBottom(workbook), 2, 1, 2, 14);

try (FileOutputStream fileOut = new FileOutputStream("C:<file location>/workbook.xlsx")) {
    workbook.write(fileOut);

        }
    }
}

Uma classe com o loop de células de formato:

public class ExcelMethods {

public void formatRange(XSSFWorkbook workbook,
                        XSSFSheet sheet,
                        XSSFCellStyle style,
                        int rowStart,
                        int numRows,
                        int columnStart,
                        int numColumns) {
    for (int i = rowStart; i <= rowStart + numRows; i++) {
        XSSFRow row = sheet.createRow(i);
        for (int j = columnStart; j <= columnStart + numColumns; j++) {
            XSSFCell cell = row.createCell(j);
            cell.setCellStyle(style);
        }
    }
}

Uma classe com os estilos definidos:

public class ExcelStyles{

public XSSFCellStyle fillPMEDarkGray(XSSFWorkbook workbook) {
    XSSFColor pmeDarkGray = new XSSFColor(new java.awt.Color(128, 128, 128));
    XSSFCellStyle fillCell = workbook.createCellStyle();
    fillCell.setFillForegroundColor(pmeDarkGray);
    fillCell.setFillPattern(SOLID_FOREGROUND);

    return fillCell;
}

public XSSFCellStyle borderLeft(XSSFWorkbook workbook) {
    XSSFCellStyle cellBorder = workbook.createCellStyle();
    cellBorder.setBorderLeft(BorderStyle.THICK);

    return cellBorder;
}

public XSSFCellStyle borderRight(XSSFWorkbook workbook) {
    XSSFCellStyle cellBorder = workbook.createCellStyle();
    cellBorder.setBorderRight(BorderStyle.THICK);

    return cellBorder;
}

public XSSFCellStyle borderTop(XSSFWorkbook workbook) {
    XSSFCellStyle cellBorder = workbook.createCellStyle();
    cellBorder.setBorderTop(BorderStyle.THICK);

    return cellBorder;
}

public XSSFCellStyle borderBottom(XSSFWorkbook workbook) {
    XSSFCellStyle cellBorder = workbook.createCellStyle();
    cellBorder.setBorderBottom(BorderStyle.THICK);

    return cellBorder;
    }
}

Através da combinação de Stack Overflow, POI API Documents, etc., eu entendi que uma célula pode ter apenas um único XSSFCellStyle, portanto, tentar adicionar uma borda a uma célula já preenchida se livra do preenchimento. Assim, meu código apenas produz um conjunto de células preenchidas em preto.

Parece-me estranho que o Apache POI não possa fazer o que o VBA faz tão facilmente. Eu sei que devo estar faltando alguma coisa / configurando o código errado / etc.

Além disso, também tentei usar o PropertyTemplate.drawBorders, conforme descrito na API do Apache POI, e também não consegui que isso funcionasse - o mesmo resultado.

Espero que alguém tenha apresentado uma maneira inteligente de contornar isso, já que estou no fim da minha inteligência.

Obrigado pela ajuda!

questionAnswers(1)

yourAnswerToTheQuestion