2009-09-30 9 views
9

Ich habe eine Excel-Tabellenkalkulation, auf die ich zugreifen und Werte lesen kann, ich benutze Apache POI HSSF.Wie bekomme ich die Hintergrundfarbe (Java Apache POI HSSF) für eine bestimmte Zelle?

Es wird wie folgt initialisiert:

HSSFSheet sheet; 
FileInputStream fis = new FileInputStream(this.file); 
POIFSFileSystem fs = new POIFSFileSystem(fis); 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
this.sheet = wb.getSheet(exsheet); 

ich alle über die Zellen am Iterieren, die in dem Blatt vorhanden sind, die eine Objektzelle macht:

HSSFCell cell = (HSSFCell) cells.next(); 

kann Bitte jemand vertraut mit dem Rahmen Erläutern, wie ein (HSSFColor) -Objekt erstellt wird, um die Hintergrundfarbe jeder Zelle im Blatt darzustellen.

Vielen Dank

EDIT, UPDATE

klar zu sein, was ich will, ist wissen: Wie erstelle ich/erhalten eine HSSFColor Objekt für die Hintergrundfarbe einer bestehenden Zelle?

cell.getCellStyle().getFillBackgroundColor(); 

Dieser Code liefert nur eine kurze Nummer, kein HSSFColor Objekt. Danke für die Antworten bisher.

+0

oder cell.getCellStyle untersuchen () .getFillForegroundColor(), das Excel-Blatt, das ich lese, gibt die gleiche Farbe für die Hintergrundfarbe zurück, obwohl die Zelle gefärbt ist. –

Antwort

1

Sie würden so etwas wie:

HSSFCell myCell = ...; 
HSSFCellStyle myStyle = workbook.createCellStyle(); 
myStyle.setFillBackgroundColor(HSSFColor.BLUE); 

myCell.setCellStyle(myStyle); 

Ich glaube, es eine begrenzte Anzahl von Arten für eine bestimmte Arbeitsmappe ist; Sie werden das gleiche Stilobjekt wo immer möglich wiederverwenden wollen.

[Bearbeiten: Sorry, das wäre die Farbe in einer Zelle zu setzen. Um die Farbe zu erhalten, verwenden wie:

myCell.getCellStyle().getFillBackgroundColor(); 

]

[Edit 2: Ein Blick auf die eigene Farbinformation craig geschrieben, vielleicht können Sie versuchen:

HSSFColor.getIndexHash().get(myCell.getCellStyle().getFillBackgroundColor()) 

]

+0

Danke für deine Anfrage bisher, leider ist es nicht ganz eine Lösung, ich habe die Frage jetzt neu geklärt. – java

+0

Meine Antwort wurde mit Hilfe von Craigs Post aktualisiert – RMorrisey

5

die Farbe zu erhalten: Der kurze Wert durch die getFillBackgroundColor zurückgegeben wird, ist der Excel-Index der Farbe. Sie können die Farbe, die dem Index entspricht, in der HSSFColor HashTable abrufen, indem Sie den letzten angegebenen Code RMorrisey verwenden.

So stellen Sie eine Farbe ein: Sie erstellen eine benutzerdefinierte Palette und ändern die Farbe an einem bestimmten Index. Dann wenden Sie die Farbe auf den Stil an.

//creating a custom palette for the workbook 
HSSFPalette palette = wb.getCustomPalette(); 
//replacing the standard red with freebsd.org red 
palette.setColorAtIndex(HSSFColor.RED.index, 
     (byte) 153, //RGB red (0-255) 
     (byte) 0, //RGB green 
     (byte) 0  //RGB blue 
); 
// or creating a new Color 
HSSFColor myColor = palette.addColor((byte) 153, (byte) 0, (byte) 0); 
HSSFCellStyle style = wb.createCellStyle(); 

style.setFillForegroundColor(myColor); 

Grüße

Guillaume

2

Die Hintergrundfarbe Informationen von XSSFCellStyle kann aus dem Verfahren erhalten:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor() 

Sie können es ausdrucken und Sie werden sehen, es ist Struktur.

0
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Iterator;  
import org.apache.poi.hssf.usermodel.HSSFPalette;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.hssf.util.HSSFColor;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.CellStyle;  
import org.apache.poi.ss.usermodel.Row;  

/** 
* @author [email protected] 
* 
*/ 

public class ExcelPractice { 

    /** 
    * Must Read :  
    * 
    * Code to get the background color from an excel sheet in RGB Format and display on the console  
    * Save the content of the xls file into another OUTPUT.xls file.  
    * Using a sample sheet with only first row filled with background color.  
    * Code uses HSSF which means i am only using xls format.  
    * Using poi-3.5-FINAL.jar  
    * Solution with the output provided  
    * Observation : Some Custom color's are not recognized as they may not be defined  
    * in the excel color palette thus the code returns the almost similar color code.  
    */ 
    public static void main(String[] args) { 
     try { 
      FileInputStream fileInputStream=new FileInputStream(new  File("D:\\Excel_File.xls")); 

      HSSFWorkbook workbook=new HSSFWorkbook(fileInputStream); 
      HSSFSheet sheet=workbook.getSheetAt(0); 
      Iterator<Row> rowIterator= sheet.iterator(); 
      while (rowIterator.hasNext()) { 
       Row row=rowIterator.next(); 

       Iterator<Cell> cellIterator=row.cellIterator(); 
       while (cellIterator.hasNext()) { 
        Cell cell = (Cell) cellIterator.next(); 

         switch (cell.getCellType()) { 
         case Cell.CELL_TYPE_BOOLEAN: 
          System.out.println(cell.getBooleanCellValue()+"\t\t"); 
         System.out.println(cell.getCellStyle().getFillForegroundColor()); 
         break; 
        case Cell.CELL_TYPE_NUMERIC: 
         System.out.println(cell.getNumericCellValue()+"\t\t"); 
         System.out.println(cell.getCellStyle().getFillForegroundColor()); 
         break; 
        case Cell.CELL_TYPE_STRING: 
         System.out.println(cell.getStringCellValue()+"\t\t"); 
         //System.out.println(HSSFColor.getIndexHash().get(cell.getCellStyle().getFillBackgroundColor())); 
         int num=cell.getColumnIndex(); 
         Cell cell1 = row.getCell(num); 
         CellStyle cellStyle = cell1.getCellStyle();   
         getColorPattern(cellStyle.getFillForegroundColor()); 
         break; 
        default: 
         break; 
        } 
       } 
       System.out.println(); 

       fileInputStream.close(); 
       FileOutputStream fileOutputStream=new FileOutputStream(new File("D:\\OUTPUT.xls")); 
       workbook.write(fileOutputStream); 
       fileInputStream.close(); 
      } 


    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.toString(); 
    } 
    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

//Method to identify the color pattern 
private static short[] getColorPattern(short colorIdx){   
    short[] triplet = null; 
    HSSFWorkbook workbook=new HSSFWorkbook(); 
    HSSFPalette palette = workbook.getCustomPalette(); 
    HSSFColor color = palette.getColor(colorIdx); 
    triplet = color.getTriplet();  
    System.out.println("color : " + triplet[0] +"," + triplet[1] + "," +  triplet[2]); 
    return triplet; 
} 
} 

/** Output of the above code as executed in my system 
S.NO.  
color : 255,255,0 
VTU Number  
color : 0,128,0 
First Name  
color : 51,204,204 
Middle Name  
color : 255,0,0 
Last Name  
color : 102,102,153 
Branch  
color : 255,102,0 
E-mail id  
color : 0,255,0 
Mobile Number  
color : 255,255,255 
*/ 

Screen shot from the Excel_File.xls file

1

Um die Hintergrundfarbe der spezifischen Zelle in HEX zu erhalten, verwenden Sie diese:

cell.getCellStyle().getFillForegroundColorColor().getARGBHex() 

Hinweis das Wort Color zweimal verwendet wird

0

Hier finden Sie für XSSF und ist in Scala, aber es zeigt genau, wie man die Farbe vom Objektmodell bekommt. Ich wollte ein java.awt.Color-Objekt aus den tatsächlichen rgb-Werten instantiieren (was teilweise nützlich ist, weil mein Debugger für mich die tatsächliche Farbe des Objekts anzeigt, wenn ich an Haltepunkten stoppe und teilweise, weil dies für den Export in Systeme mit nichts mit Excel zu tun). Ich ignoriere den Alpha-Wert der Farbe und meine Scala ist vielleicht ein bisschen naiv. Ich würde vorschlagen, dass, wenn dies bei Ihnen nicht funktioniert, sollten Sie eine Pause-Punkt gesetzt und das Ergebnis von eng verwandten Methode aufruft wie getFill Zurück groundColorColor()

val rgb: Array[Byte] = cell.getCellStyle.getFillForegroundColorColor.getRgb 
    def toInt(b: Byte): Int = { 
     if (b<0) 256+b else b 
    } 
    val rgbInts = rgb.map(toInt) 
    val color = new Color(rgbInts(0),rgbInts(1),rgbInts(2)) 
Verwandte Themen