web-dev-qa-db-ja.com

特定のセルの(Java Apache POI HSSF)背景色を取得するにはどうすればよいですか?

値にアクセスして読み取る既存のExcelスプレッドシートがあり、Apache POIHSSFを使用しています。

これは次のように初期化されます。

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オブジェクトではなく、短い数値のみを返します。これまでの回答に感謝します。

10
java

HSSFCellクラスによって提供される静的カラークラスがあり、以下にリストされています。

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

独自のカスタムカラーを作成する場合は、カスタムパレットを作成および変更する必要があります。 Apacheは、これについても非常に明確なガイドを提供します。

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

7
Craig Otis

色を取得するには: getFillBackgroundColorによって返される短い値は、色のExcelインデックスです。示された最後のコードRMorriseyを使用して、HSSFColorHashTableのインデックスに対応する色を取得できます。

色を設定するには:カスタムパレットを作成し、特定のインデックスで色を変更します。次に、スタイルに色を適用します。

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

よろしく

ギヨーム

5
PATRY Guillaume

XSSFCellStyleの背景色情報は、次のメソッドから取得できます。

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

印刷すると、その構造がわかります。

2
Pudge

HEXの特定のセルの背景色を取得するには、次を使用します。

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

Word Colorが2回使用されていることに注意してください

1
Ascalonian
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
ScaryJoker

あなたは次のようなことをします:

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

myCell.setCellStyle(myStyle);

特定のワークブックには限られた数のスタイルがあると思います。可能な場合は、同じスタイルのオブジェクトを再利用することをお勧めします。

[編集:申し訳ありませんが、それはセルの色を設定することです。色を取得するには、次のように使用します。

myCell.getCellStyle().getFillBackgroundColor();

]

[編集2:投稿されたカスタムカラー情報クレイグを見て、多分あなたは試すことができます:

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

]

1
RMorrisey

以下はXSSF用で、Scalaにありますが、オブジェクトモデルから色を取得する方法を正確に示しています。実際のrgb値からJava.awt.Colorオブジェクトをインスタンス化したかった(これは、ブレークポイントで停止したときにデバッガーがオブジェクトの実際の色を表示するため、またこれがExcelとは関係のないシステムにエクスポートするためのものであるため便利です)。色のアルファ値と私の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))
0
Anthony Holland

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

0
Keith