値にアクセスして読み取る既存の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オブジェクトではなく、短い数値のみを返します。これまでの回答に感謝します。
HSSFCellクラスによって提供される静的カラークラスがあり、以下にリストされています。
http://poi.Apache.org/apidocs/org/Apache/poi/hssf/util/HSSFColor.html
独自のカスタムカラーを作成する場合は、カスタムパレットを作成および変更する必要があります。 Apacheは、これについても非常に明確なガイドを提供します。
http://poi.Apache.org/spreadsheet/quick-guide.html#CustomColors
色を取得するには: 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);
よろしく
ギヨーム
XSSFCellStyleの背景色情報は、次のメソッドから取得できます。
XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()
印刷すると、その構造がわかります。
HEXの特定のセルの背景色を取得するには、次を使用します。
cell.getCellStyle().getFillForegroundColorColor().getARGBHex()
Word Color
が2回使用されていることに注意してください
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
*/
あなたは次のようなことをします:
HSSFCell myCell = ...;
HSSFCellStyle myStyle = workbook.createCellStyle();
myStyle.setFillBackgroundColor(HSSFColor.BLUE);
myCell.setCellStyle(myStyle);
特定のワークブックには限られた数のスタイルがあると思います。可能な場合は、同じスタイルのオブジェクトを再利用することをお勧めします。
[編集:申し訳ありませんが、それはセルの色を設定することです。色を取得するには、次のように使用します。
myCell.getCellStyle().getFillBackgroundColor();
]
[編集2:投稿されたカスタムカラー情報クレイグを見て、多分あなたは試すことができます:
HSSFColor.getIndexHash().get(myCell.getCellStyle().getFillBackgroundColor())
]
以下は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))
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.
そのため、現時点では、このケースを処理する方法がなく、ユーザーに「パターンカラー」も入力するように要求するだけです。