Не удалось задать цвет фона для строки в листе excel

80
5

У меня есть файл excel с расширением xls. Я хочу дать цвет фона всех строк на основе первого значения столбца каждой строки. Мой код не работает в соответствии с моим требованием. Цвет основной земли происходит, но не соответствует требованию. Я использую apache POI jar для реализации.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
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.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;

public class DemoPainter {

public void colorSheet() throws IOException {

FileInputStream fi = new FileInputStream(
"/vobs/SampleFile.xls");
POIFSFileSystem fs = new POIFSFileSystem(fi);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
System.out.println("Sheet Name: " + sheet.getSheetName());
startColor(sheet, wb);
}

public void startColor(HSSFSheet sheet, HSSFWorkbook wb) throws IOException {

for (int rowIndex = 0; rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++){
Row row=sheet.getRow(rowIndex);
Cell cell=row.getCell(0);
System.out.println(cell.getStringCellValue());
if(cell.getStringCellValue().equals("modified")){
setYellowColor(wb,row);
}
else if(cell.getStringCellValue().equals("removed")){
setRedColor();
}
else {
setGreenColor();
}
}
FileOutputStream out = new FileOutputStream(new File("/vobs/SampleFile1.xls"));
wb.write(out);
out.close();
}

public void setYellowColor(HSSFWorkbook wb,Row row){
CellStyle style = wb.createCellStyle();
System.out.println("started Yellow color");
style.setFillForegroundColor(HSSFColor.YELLOW.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
row.setRowStyle(style);
}

public void setRedColor(){

}

public void setGreenColor(){

}

}

Требуемый вывод изображения листа excel, Current Output excel sheet image на основе поведения моего кода

Может ли кто-нибудь помочь здесь?

спросил(а) 2018-01-15T01:06:00+03:00 2 года, 8 месяцев назад
1
Решение
57

Продвижение комментария к ответу....

У вас две проблемы. Проблема №1 - Стили ячеек - это рабочая область, поэтому не создавайте ее для каждой строки! Создайте их раньше, иначе вы превысите максимальное количество стилей, разрешенных Excel в рабочей книге.

Проблема №2 - Вы не ставите отдельные заполненные ячейки в строках. Стили стилей по умолчанию применяются к новым ячейкам, добавленным в Excel. Они не применяются к уже существующим ячейкам, так как при создании ячейки она всегда ссылается на прикладной стиль. Таким образом, вам нужно также установить стиль ячейки в существующих ячейках в строке.

Бонусная проблема № 3 - вы закодированы в HSSF везде, поэтому ваш код будет работать только с файлами XLS. См. Http://poi.apache.org/spreadsheet/converting.html о том, как изменить код, чтобы быть общим, и работать для XLSX тоже

Измените свой код, чтобы быть похожим...

File input = new File("/vobs/SampleFile.xls");
DataFormatter formatter = new DataFormatter();
Workbook wb = WorkbookFactory.create(input);
Sheet sheet = wb.getSheetAt(0);
System.out.println("Sheet Name: " + sheet.getSheetName());

CellStyle yellow = wb.createCellStyle();
yellow.setFillForegroundColor(Color.YELLOW.index);
yellow.setFillPattern(CellStyle.SOLID_FOREGROUND);

// And Red etc

for (Row r : sheet) {
Cell c1 = r.getCell(0);
if (c1 == null) {
// Empty row
continue;
}
// Get cell as string
String val = formatter.formatCellValue(c1);

// Check
if(val.equals("modified")) {
r.setRowStyle(yellow);
for (Cell c : r) {
c.setCellStyle(yellow);
}
}
else if(val.equals("removed")){
// etc
}
}

FileOutputStream out = new FileOutputStream(new File("/vobs/Changed.xls"));
wb.write(out);
out.close();

ответил(а) 2018-01-17T08:52:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема