2012-06-06 15 views
20

Desidero impostare il colore di primo piano di una cella su un determinato colore in codice esadecimale. Ad esempio, quando si tenta di impostare a rosso:Apache POI XSSFColor dal codice esadecimale

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed()); 

Non importa quale sia il valore esadecimale ho impostato nel parametro per la funzione di decodifica, la funzione GetIndexed restituirà sempre il colore nero.

Potrebbe essere che potrei fare qualcosa di sbagliato? Penso che sia un errore ma non sono sicuro ...

+0

perché è necessario getIndexed()? Per compatibilità con le versioni precedenti ?? Prova a rimuoverlo. – gtiwari333

+0

Se si applica lo stile a una cella, viene visualizzato correttamente in rosso in Excel? – Gagravarr

+0

Ho bisogno di getindexed perché il metodo accetta solo un valore breve. – Neets

risposta

67

La buona notizia è che se si utilizza XSSF, al contrario di HSSF, la soluzione al problema è abbastanza semplice. Devi semplicemente trasmettere la tua variabile di stile a XSSFCellStyle. Se lo fai, allora c'è una versione di setFillForegroundColor che accetta un argomento XSSFColor, quindi non è necessario chiamare getIndexed(). Ecco alcuni esempi di codice:

XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle(); 
XSSFColor myColor = new XSSFColor(Color.RED); 
style.setFillForegroundColor(myColor); 

Tuttavia, se si utilizza HSSF, le cose sono più difficili. HSSF usa una tavolozza di colori, che è semplicemente una serie di colori. Il valore breve che si passa a setFillForegroundColor è un indice nella tavolozza.

Quindi il problema che si verifica è la conversione di un valore rgb in un indice di tavolozza. La soluzione che hai proposto, usando getIndexed(), è logica, ma, sfortunatamente, funziona per XSSFColor nel modo in cui potresti supporre che dovrebbe.

Fortunatamente, c'è una soluzione. Per il momento, supponiamo che sarai soddisfatto utilizzando uno dei colori nella tavolozza predefinita, piuttosto che usare un colore personalizzato. In tal caso, è possibile utilizzare le classi HSSFPalette e HSSFColor per risolvere il problema. Ecco qualche esempio di codice:

HSSFWorkbook hwb = new HSSFWorkbook(); 
HSSFPalette palette = hwb.getCustomPalette(); 
// get the color which most closely matches the color you want to use 
HSSFColor myColor = palette.findSimilarColor(255, 0, 0); 
// get the palette index of that color 
short palIndex = myColor.getIndex(); 
// code to get the style for the cell goes here 
style.setFillForegroundColor(palIndex); 

Se si desidera usare i colori personalizzati non già nella tavolozza di default, allora dovete aggiungerli alla tavolozza. Javadoc per HSSFPalette definisce i metodi che è possibile utilizzare per farlo.

+0

Stavo usando XSSF, quindi la prima soluzione ha fatto il trucco. Molte grazie! – Neets

+1

Grazie amico stavo cercando questo –

+0

XSSFColor ha funzionato come un fascino !. grazie – Gleeb

6

si può semplicemente effettuare le seguenti operazioni:

XSSFColor grey =new XSSFColor(new java.awt.Color(192,192,192)); 
cellStyle.setFillForegroundColor(grey); 

e funziona :)

+3

anche questo funziona e dà modo semplice di applicare il colore RGB a una cella – Gleeb

+0

Basta notare che questo potrebbe violare il vostro server a causa delle dipendenze delle classi AWT e il server potrebbe non funzionare. Non ho ancora controllato. – Daniel

12

Usa XSSFColor per XSSFWorkbook. XSSFColor può richiedere byte[] rgb o java.awt.Color. vedere esempi di seguito:

  1.  

    XSSFWorkbook wb = new XSSFWorkbook(); 
    XSSFCellStyle cellStyle = wb.createCellStyle(); 
    byte[] rgb = new byte[3]; 
    rgb[0] = (byte) 242; // red 
    rgb[1] = (byte) 220; // green 
    rgb[2] = (byte) 219; // blue 
    XSSFColor myColor = new XSSFColor(rgb); // #f2dcdb 
    cellStyle.setFillForegroundColor(myColor); 
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    
  2. veda la risposta di GuenSeven

    XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb 
    cellStyle.setFillForegroundColor(myColor); 
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    
+0

Non riesco a utilizzare .setFillForegroundColor (myColor); Cosa faccio? – meme

+0

@meme, aggiornamento alla versione poi 3.0.7 o successiva, utilizzo la versione 3.10 –

0

XSSFCellStyle accettare il colore in modo setFillForegroundColor per la versione poi sopra 3,07 ... in modo da controllare prima la tua versione per evitare di entrare nel problema stava affrontando ... la versione precedente aveva bisogno di una discussione breve.