/ / Usando cores personalizadas com SXSSF (Apache POI) - java, excel, apache-poi

Usando cores personalizadas com SXSSF (Apache POI) - java, excel, apache-poi

Eu estou tentando escrever um enorme arquivo de excel, minha exigência me permite escrever a linha e esquecer, então eu estou usando SXSSF que permite manter apenas um pequeno número de linhas na memória e todos os restantes são gravados no documento. isso ajuda a superar a exceção outofmory de arquivos grandes.

mas eu também preciso definir estilos para as células usandopasta de trabalho sxssf. Não consigo encontrar uma maneira de definir e usar cores personalizadas no SXSSF (como no XSSF, podemos definir uma cor personalizada diretamente e, no HSSF, podemos substituir uma entrada na paleta por uma cor personalizada)

não consigo encontrar uma maneira de acessar uma paleta Pasta de trabalho SXSSF.

Eu não posso criar um novo Paleta de HSSF como o construtor está protegido.

a única maneira que parece viável agora éde alguma forma, encontrar uma cor semelhante de uma lista de todas as cores predefinidas e usá-lo, em vez do original (mas isso exigiria ter um algoritmo de correspondência de cores rgb, que seria outra tarefa)

Alguém pode sugerir uma solução alternativa (ou talvez sugerir um algoritmo primitivo de correspondência de cores rgb)

Respostas:

11 para resposta № 1

Então, depois de um pouco de pesquisa pela web elendo os documentos, eu tenho uma sugestão de que o SXSSF é realmente um wrapper em torno de XSSF, então eu typecasted o CellStyle retornado pela pasta de trabalho SXSSF para XSSF e foi capaz de usar XSSFColor diretamente para gerar cores.

SXSSFWorkbook workbook = new SXSSFWorkbook(50);
Sheet sheet = workbook.createSheet("Image Data");
....
Cell cell = row.createCell(j);
cell.setCellValue(j);
XSSFCellStyle cs1 = (XSSFCellStyle) workbook.createCellStyle();
cs1.setFillForegroundColor(new XSSFColor(new java.awt.Color(red,green,blue)));
cs1.setFillPattern(CellStyle.SOLID_FOREGROUND);
cell.setCellStyle(cs1);

4 para resposta № 2

Para evitar a necessidade de typecast para os cellStyles,crie primeiro um XSSFWorkbook com cellStyles (XSSFCellStyle) aplicando as cores personalizadas e, em seguida, envolva-o com um construtor SXSSFWorkbook como o exemplo abaixo:

/**
* Sample based on POI <a href="http://poi.apache.org/spreadsheet/how-to.html#sxssf">Spreadsheet How-To</a>.
*
* @see <a href="https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html">SXSSFWorkbook</a>
*/
public static void main(String[] args) throws Throwable {

XSSFWorkbook xssfWorkbook = new XSSFWorkbook();

XSSFColor colorGrey = new XSSFColor(new Color(210, 210, 210));
XSSFCellStyle cellStyleGrey = xssfWorkbook.createCellStyle();
cellStyleGrey.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyleGrey.setFillForegroundColor(colorGrey);

// keep 100 rows in memory, exceeding rows will be flushed to disk
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook, 100);
Sheet sheet = sxssfWorkbook.createSheet();

for (int rownum = 0; rownum < 1000; rownum++) {
Row row = sheet.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);

// for even rows apply the grey cellStyle
if (rownum % 2 == 0) {
cell.setCellStyle(cellStyleGrey);
}
}

}

// Omitted asserts block from original sample...

FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
sxssfWorkbook.write(out);
out.close();

// dispose of temporary files backing this workbook on disk
sxssfWorkbook.dispose();
}