HSSFColor без ячейки фона возвращает неправильный цвет - PullRequest
1 голос
/ 04 апреля 2019

Я использую Apache POI 3.9 в моем проекте. Я пытаюсь прочитать ячейку Excel объекта HSSF, и из этого я пытаюсь получить цвет фона

Workbook myWorkBook = WorkbookFactory.create(new File(filePath));
Sheet mySheet = myWorkBook.getSheetAt(0);

Row currentRow = null;
Iterator<Row> rowIterator = mySheet.iterator();
while (rowIterator.hasNext())
{
currentRow = (Row) rowIterator.next();
totalColumns = currentRow.getPhysicalNumberOfCells();

for (int column = 0; column < totalColumns; column++)
{
Cell cell = currentRow.getCell(column);
CellStyle cellStyle = cell.getCellStyle();
short colorIdx=cellStyle.getFillForegroundColor();

HSSFWorkbook workbook = (HSSFWorkbook)myWorkBook;
HSSFPalette palette = workbook.getCustomPalette();
HSSFColor color = palette.getColor(colorIdx);

short[] triplet = color.getTriplet();
System.out.println("Now Color :"+triplet[0]+"-"+triplet[1]+"-"+triplet[2]);
}
}

В приведенном выше коде я пытаюсь получить цвет RGB. В этой проблеме некоторые цвета ячеек не имеют фона (НЕТ заливки), но color.getTriplet () возвращает 0,0,0, т.е. черный цвет фона. Как различить и получить исходный цвет фона.

1 Ответ

2 голосов
/ 04 апреля 2019

Excel заполнение ячеек - это заполнение шаблона. Цвет переднего плана заливки - это цвет рисунка, а цвет фона заливки - цвет позади рисунка.

Так что, только если шаблон заливки вообще существует, цвета имеют смысл, иначе нет. Поэтому определите, заполнена ли ячейка, получая шаблон заливки, а не по цвету.

Do CellStyle.getFillPattern и только в том случае, если FillPatternType не FillPatternType.NO_FILL , тогда ячейка заполняется.

В текущих apache poi версиях вы будете делать:

...
CellStyle cellStyle = cell.getCellStyle();
FillPatternType patternType = cellStyle.getFillPattern();
if (patternType  != FillPatternType.NO_FILL) {
 short colorIdx = cellStyle.getFillForegroundColor();
 ...

В древнем apache poi 3.9 CellStyle.getFillPattern возвращает short. Так должно быть:

...
CellStyle cellStyle = cell.getCellStyle();
short patternType = cellStyle.getFillPattern();
if (patternType  != 0) {
 short colorIdx = cellStyle.getFillForegroundColor();
 ...
...