Apache POI XSSFColor из шестнадцатеричного кода
Я хочу установить цвет переднего плана ячейки для заданного цвета в шестнадцатеричном коде. Например, когда я пытаюсь установить его на красный:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
Независимо от того, какое значение Hex задано в параметре для функции декодирования, функция getIndexed всегда возвращает черный цвет.
Может быть, я что-то делаю неправильно? Я думаю, что это ошибка, но я не уверен...
Ответы
Ответ 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);