2009-09-30 170 views
9

我有一個現有的Excel電子表格,我正在使用和讀取值,我正在使用Apache POI HSSF。如何獲取給定單元格的(Java Apache POI HSSF)背景顏色?

據初始化是這樣的:

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

我迭代中存在的表,這使得電池對象中的所有單元:

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

請某人熟悉框架解釋如何創建(HSSFColor)對象來表示表單中每個單元格的背景顏色。

非常感謝

編輯,更新

要弄清楚我想知道的是:我怎麼創建/獲取現有的單元格的背景顏色的HSSFColor對象?

cell.getCellStyle().getFillBackgroundColor(); 

此代碼只返回一個短數字,而不是一個HSSFColor對象。 感謝您的答案。

+0

或cell.getCellStyle( ).getFillForegroundColor(),即使單元格被着色,我正在閱讀的Excel表格也會爲背景顏色返回相同的顏色。 – 2011-10-19 17:06:15

回答

1

你會做這樣的事情:

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

myCell.setCellStyle(myStyle); 

我相信是有風格對於給定的工作簿的數量有限;你會想在可能的情況下重用相同的樣式對象。

[編輯:對不起,這將設置單元格的顏色。爲了獲得顏色,使用這樣的:

myCell.getCellStyle().getFillBackgroundColor(); 

]

[編輯2:綜觀自定義顏色信息克雷格貼出來,也許你可以試試:

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

]

+0

迄今爲止,感謝你的anser,不幸的是它不是一個解決方案,我現在已經重新澄清了這個問題。 – java 2009-10-01 08:04:23

+0

更新我的答案,從克雷格的帖子的一點幫助 – RMorrisey 2009-10-01 18:19:18

5

,使色彩: 由getFillBackgroundColor返回的短值是顏色的Excel的指數。 使用指示的最後一個代碼RMorrisey,可以獲取與HSSFColor HashTable中的索引對應的顏色。

要設置顏色: 您可以創建自定義調色板,並更改給定索引處的顏色。然後,將顏色應用於樣式。XSSFCellStyle的

//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); 

問候

紀堯姆

2

的的backgroundColor信息可以從該方法獲得:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor() 

你可以把它打印出來,你會看到它的結構。

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

要獲得HEX特定小區的背景顏色,使用此:

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

通知字Color兩次使用

0

以下是XSSF並且在Scala中,但它確實顯示瞭如何從對象模型中獲取顏色。我想從實際的rgb值中實例化一個java.awt.Color對象(這很有用,部分原因是因爲當我停在斷點處時,調試器會顯示對象的實際顏色,部分原因是因爲這用於導出到具有與Excel無關)。我忽略了顏色的alpha值,我的Scala可能有點天真。我建議,如果這個不適合你,你應該設置一個斷點,並檢查緊密相關方法的結果調用,例如getFill 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)) 
相關問題