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!