如何获取给定单元格的(Java Apache POI HSSF)背景颜色?

时间:2009-09-30 18:03:55

标签: java apache-poi poi-hssf hssf

我有一个现有的Excel电子表格,我正在访问并从中读取值,我正在使用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对象。 谢谢你到目前为止的答案。

8 个答案:

答案 0 :(得分:7)

HSSFCell类提供了静态颜色类,如下所示:

http://poi.apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html

如果要创建自己的自定义颜色,则需要创建和修改自定义调色板。 Apache也为此提供了非常清晰的指南:

http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors

答案 1 :(得分:5)

获取颜色: getFillBackgroundColor返回的short值是颜色的Excel索引。 您可以使用RMorrisey指示的最后一个代码获取HSSFColor HashTable中与索引相对应的颜色。

设置颜色 您可以创建自定义调色板,并更改给定索引处的颜色。然后,将颜色应用于样式。

//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 :(得分:2)

XSSFCellStyle的backgroundcolor信息可以从以下方法获得:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

你可以将它打印出来,你会看到它的结构。

答案 3 :(得分:1)

您可以这样做:

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

myCell.setCellStyle(myStyle);

我相信给定工作簿的样式数量有限;您将希望尽可能重用相同的样式对象。

[编辑:对不起,那就是在单元格上设置颜色。要获得颜色,请使用:

myCell.getCellStyle().getFillBackgroundColor();

[编辑2:查看已发布的自定义颜色信息,也许您可​​以尝试:

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

答案 4 :(得分:1)

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 mohdasif_2688@rocketmail.com 
 *
 */

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

答案 5 :(得分:1)

要获取HEX中特定单元格的背景颜色,请使用:

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

注意单词Color使用了两次

答案 6 :(得分:0)

以下内容适用于XSSF并且在Scala中,但它确实显示了如何从对象模型中获取颜色。我想从实际的rgb值中实例化一个java.awt.Color对象(这很有用,部分原因是我的调试器为我显示了当我在断点处停止时对象的实际颜色,部分是因为这是为了导出到有系统的系统与Excel无关)。我忽略了颜色的alpha值,而我的Scala可能有点幼稚。我建议如果这对你不起作用,你应该设置一个断点并检查密切相关的方法调用的结果,例如getFill Back 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))

答案 7 :(得分:0)

对于XSSF读取xlsx文件(也尝试了HSSF),经过一段时间的努力,我发现getFillBackgroundXSSFColor()方法实际上在Excel中的“设置单元格格式”的“填充”选项卡中返回了“图案颜色”,而不是该标签中的所谓“背景”颜色。我不确定这是否可以预期。

请参阅下面的屏幕截图。返回的RGB实际上是FF0000,即红色。

        XSSFColor backgroundColor = cell.getCellStyle().
            getFillBackgroundXSSFColor();
    System.out.println("backgroundColor is "+backgroundColor.getARGBHex());

    Output: FFFF0000 //the first FF should be ignored.

所以现在,我没有办法解决这种情况,只是要求用户也填写“图案颜色”。

enter image description here