11

我有一个现有的 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 对象。感谢您到目前为止的答案。

4

8 回答 8

7

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

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

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

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

于 2009-09-30T18:21:59.353 回答
5

获取颜色: getFillBackgroundColor 返回的短值是颜色的 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);

问候

纪尧姆

于 2009-10-12T14:41:18.967 回答
2

XSSFCellStyle 的背景颜色信息可以从方法中获取:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

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

于 2012-08-05T04:08:37.817 回答
1

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

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

注意这个词Color被使用了两次

于 2014-12-23T14:40:59.390 回答
1

你会做这样的事情:

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

myCell.setCellStyle(myStyle);

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

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

myCell.getCellStyle().getFillBackgroundColor();

]

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

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

]

于 2009-09-30T18:21:20.690 回答
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 
*/

Excel_File.xls 文件的屏幕截图

于 2014-04-06T06:56:22.027 回答
0

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

看我下面的截图。返回的 RGB 实际上是 FF0000 ,即 RED。

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

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

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

在此处输入图像描述

于 2018-12-05T01:48:59.927 回答
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))
于 2015-10-06T10:37:19.277 回答