Подтвердить что ты не робот

Apache POI XSSFColor из шестнадцатеричного кода

Я хочу установить цвет переднего плана ячейки для заданного цвета в шестнадцатеричном коде. Например, когда я пытаюсь установить его на красный:

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());

Независимо от того, какое значение Hex задано в параметре для функции декодирования, функция getIndexed всегда возвращает черный цвет.

Может быть, я что-то делаю неправильно? Я думаю, что это ошибка, но я не уверен...

4b9b3361

Ответ 1

Хорошей новостью является то, что если вы используете XSSF, а не HSSF, то решение вашей проблемы довольно просто. Вам просто нужно передать переменную стиля в XSSFCellStyle. Если да, то есть версия setFillForegroundColor, которая принимает аргумент XSSFColor, поэтому вам не нужно вызывать getIndexed(). Вот пример кода:

XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle();
XSSFColor myColor = new XSSFColor(Color.RED);
style.setFillForegroundColor(myColor);

Однако, если вы используете HSSF, тогда все сложнее. В HSSF используется цветовая палитра, которая представляет собой просто набор цветов. Короткое значение, которое вы передаете в setFillForegroundColor, является индексом в палитре.

Итак, проблема заключается в преобразовании значения rgb в индекс палитры. Решение, которое вы предложили, используя getIndexed(), логично, но, к сожалению, оно работает для XSSFColor так, как вы могли предположить.

К счастью, есть решение. На данный момент предположим, что вы будете удовлетворены использованием одного из цветов в палитре по умолчанию, вместо использования пользовательского цвета. В этом случае вы можете использовать классы HSSFPalette и HSSFColor для решения проблемы. Вот пример кода:

HSSFWorkbook hwb = new HSSFWorkbook();
HSSFPalette palette = hwb.getCustomPalette();
// get the color which most closely matches the color you want to use
HSSFColor myColor = palette.findSimilarColor(255, 0, 0);
// get the palette index of that color 
short palIndex = myColor.getIndex();
// code to get the style for the cell goes here
style.setFillForegroundColor(palIndex);

Если вы хотите использовать пользовательские цвета еще не в палитре по умолчанию, вы должны добавить их в палитру. Javadoc для HSSFPalette определяет методы, которые вы можете использовать для этого.

Ответ 2

Для Apache POI до 4.0 вы можете просто сделать следующее:

 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192));
 cellStyle.setFillForegroundColor(grey);

Начиная с POI 4.0 вы должны предоставить рабочий стол IndexedColorMap:

 IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap);
 cellStyle.setFillForegroundColor(grey);

Ответ 3

Используйте XSSFColor для XSSFWorkbook. XSSFColor может принимать byte[] rgb или java.awt.Color. См. Примеры ниже:

  •  

    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFCellStyle cellStyle = wb.createCellStyle();
    byte[] rgb = new byte[3];
    rgb[0] = (byte) 242; // red
    rgb[1] = (byte) 220; // green
    rgb[2] = (byte) 219; // blue
    XSSFColor myColor = new XSSFColor(rgb); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    
  • см. ответ GuenSeven

    XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    

Ответ 4

XSSFCellStyle принимает цвет в методе setFillForegroundColor для версии poi выше 3.07... поэтому сначала проверьте свою версию, чтобы избежать попадания в проблему, с которой я столкнулся... предыдущая версия нужна как аргумент.

Ответ 5

Я не хотел использовать AWT Color, и поскольку в настоящее время нет конструктора, который принимает только байтовый массив (я использую версию 3.17): существует конструктор public XSSFColor(byte[] rgb, IndexedColorMap colorMap), который трюк для меня:

byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);