APACHE POI 4.1: установить цвет фона ячейки из шестнадцатеричного кода - PullRequest
1 голос
/ 28 октября 2019

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

Я делаю что-то вроде:

Workbook workbook = new XSSFWorkbook(); 
Sheet sheet = workbook.createSheet(sheetName);

XSSFCellStyle cellStyle = ((XSSFCellStyle) workbook.createCellStyle());

if (styleObject.getBgColor() != null) {
    java.awt.Color javaBdgColor = java.awt.Color.decode(voceStyle.getBgColor()); // this is #FFF000
    XSSFColor bgColor = new XSSFColor(javaBdgColor, new DefaultIndexedColorMap());
    cellStyle.setFillForegroundColor(bgColor.getIndex());
    cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}

Row newRow = Rowsheet.createRow(0);
Cell newCell = newRow.createCell(0);
newCell.setCellStyle(cellStyle);

// write file
String pathFileExport = buildPathExportFile("test-export");
FileOutputStream fileOut = new FileOutputStream(pathFileExport);
workbook.write(fileOut);
fileOut.close();

//close workbook
workbook.close();

return Paths.get(pathFileExport);

Я думаю, что все хорошо в моем коде, но каждая ячейка, стилизованная таким образом, приведет к черному фону. black-cells

У меня есть некоторые сомнения по поводу экземпляра "DefaultIndexedColorMap", который находится в процессе отладки без полей:

code debugger

На данный момент, я не уверен, что делать, чтобы решить. Все в других постах, кажется, работают, но у меня все еще темный фон вместо желтого.

Есть предложения? Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Как говорит другой ответ, использование setFillForegroundColor (цвет XSSFColor) вместо использования индексированных цветов необходимо в XSSFCellStyle, когда речь идет о настраиваемых цветах. Но использование индексированных цветов из org.apache.poi.ss.usermodel.IndexedColors возможно и в XSSF. И это будет наиболее совместимым способом, если не нужно использовать настраиваемые цвета.

Но также следует избегать создания XSSFColor из java.awt.Color. Конструктор XSSFColor (java.awt.Color clr, карта IndexedColorMap) помечен «ТОЛЬКО ДЛЯ ТЕСТА». И java.awt.Color будет недоступен при некоторых обстоятельствах.

Так что, если необходимо «установить цвет фона ячейки из шестнадцатеричного кода», а шестнадцатеричный код находится в String, тогда можно использовать org.apache.commons.codec.binary.Hexполучить массив byte[] из этого String. Apache commons codec уже является одной из зависимостей apache poi. Затем можно использовать конструктор XSSFColor (byte [] rgb, IndexedColorMap colorMap) . IndexedColorMap не используется до сих пор. Так что это может быть установлено null. Если IndexedColorMap получит какое-либо использование позже, тогда код должен быть скорректирован в любом случае.

Пример:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import org.apache.commons.codec.binary.Hex;

class CreateXSSFColor {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   String rgbS = "FFF000";
   byte[] rgbB = Hex.decodeHex(rgbS); // get byte array from hex string
   XSSFColor color = new XSSFColor(rgbB, null); //IndexedColorMap has no usage until now. So it can be set null.

   XSSFCellStyle cellStyle = (XSSFCellStyle) workbook.createCellStyle();
   cellStyle.setFillForegroundColor(color);
   cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

   Sheet sheet = workbook.createSheet(); 
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   cell.setCellValue("yellow");
   cell.setCellStyle(cellStyle);

   workbook.write(fileout);
  }

 }
}
2 голосов
/ 28 октября 2019

Я заметил, что при работе с цветами в файлах xlsx (XSSF) использование индексированных цветов работает не очень хорошо. Похоже, что по умолчанию в XSSFWorkbook нет индекса для каких-либо цветов, поэтому нельзя использовать индекс цвета, который не проиндексирован.

Однако вы можете использовать перегрузку setFillForegroundColor, который напрямую принимает XSSFColor.

cellStyle.setFillForegroundColor(bgColor);

Когда я использую эту перегрузку, тогда я получаю желтый цвет в качестве фона, который вы ожидаете.

Обычно при работе с цветами в XSSF следует использовать сам XSSFColor, а не его индекс. Это касается других вещей, таких как другой узорчатый цвет («фон»), цвета рамки и цвета шрифта.

...