/ / Utilisation de couleurs personnalisées avec SXSSF (Apache POI) - java, excel, apache-poi

Utilisation de couleurs personnalisées avec SXSSF (Apache POI) - java, excel, apache-poi

J'essaie d'écrire un énorme fichier Excel, mon exigence me permet d'écrire la ligne et d'oublier, alors j'utilise SXSSF ce qui permet de ne garder qu'un petit nombre de lignes en mémoire et que le reste est écrit dans le document. cela aide à surmonter l'exception hors mémoire pour les fichiers volumineux.

mais je dois aussi définir des styles pour les cellules en utilisantclasseur sxssf. Je ne suis pas en mesure de trouver un moyen de définir et d'utiliser des couleurs personnalisées dans SXSSF (comme dans XSSF, nous pouvons définir une couleur personnalisée directement et dans HSSF, nous pouvons remplacer une entrée dans la palette par une couleur personnalisée)

je ne peux trouver aucun moyen d'accéder à une palette de Classeur SXSSF.

Je ne peux pas créer un nouveau Palette HSSF comme le constructeur est protégé.

la seule façon qui semble faisable en ce moment est detrouver en quelque sorte une couleur similaire dans une liste de toutes les couleurs prédéfinies et l'utiliser au lieu de l'original (mais cela nécessiterait d'avoir un algorithme de correspondance des couleurs en RVB, ce qui serait une autre tâche)

Quelqu'un peut-il suggérer une solution de contournement (ou peut-être suggérer un algorithme primitif de correspondance des couleurs RVB)

Réponses:

11 pour la réponse № 1

Donc, après un peu de recherche sur le Web etEn lisant la documentation, j'ai compris que SXSSF est en fait un wrapper autour de XSSF. J'ai donc converti le CellStyle renvoyé par le classeur SXSSF à XSSF et j'ai pu utiliser XSSFColor directement pour générer des couleurs.

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 pour la réponse № 2

Pour éviter le recours au typecast pour cellStyles,créez d'abord un XSSFWorkbook avec cellStyles (XSSFCellStyle) en appliquant les couleurs personnalisées, puis enveloppez-le avec un constructeur SXSSFWorkbook comme dans l'exemple ci-dessous:

/**
* 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();
}