Цвет фона ячейки автоматизации Java Excel, повторяющий setFillForegroundColor - PullRequest
0 голосов
/ 16 октября 2019

Привет всем, у меня есть код ниже, который меняет фон ячейки на RED или GREEN . Кажется, что, когда я закомментирую код ЗЕЛЕНЫЙ else, мой лист Excel имеет красный цвет для каждой ячейки в строке 1. Аналогично, если я сделаю обратное и закомментирую RED иun-comment ЗЕЛЕНЫЙ тогда все ячейки в строке 1 будут зелеными.

Я не понимаю, что в приведенном ниже коде делает все цвета одинаковыми, хотя первые 2 ячейки должны быть RED , тогда как все остальные должны быть GREEN . Я уже проверил свою логику и она идет к первому IF 2 раза, а затем все остальное идет к else , так что это правильно.

Мой код:

static CellStyle headerCellStyle    = workbook.createCellStyle();

for (int i = 0; i < arr.length; i++) {
     Row row             = sheet.createRow(rowNum1++);
     HSSFWorkbook hwb    = new HSSFWorkbook();
     HSSFPalette palette = hwb.getCustomPalette();
     Cell cell           = row.createCell(colNum);

     headerCellStyle.setWrapText(true);
     headerCellStyle.setAlignment(HorizontalAlignment.LEFT);
     headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
     headerCellStyle.setAlignment(HorizontalAlignment.JUSTIFY);
     headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

     if (arr[i].contains("*")) {
         //RED
         headerCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
         cell.setCellValue(arr[i].replace(" " + (i + 1) + ".xml*", ""));
     } else {
         //GREEN
         headerCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
         cell.setCellValue(arr[i].replace(" " + (i + 1) + ".xml", ""));
     }

     row.getCell(0).setCellStyle(headerCellStyle);
     row.setHeightInPoints(20);
}

Я уверен, что просто смотрю на что-то совершенно очевидное, но в настоящее время я не могу найти, что это может быть.

Любая помощь будет великолепна!

Примечание: также публикуется на следующих форумах:

coderanch.com

codeguru

1 Ответ

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

Заполнения ячеек сохраняются в стилях ячеек, а те, которые хранятся на уровне рабочей книги. Поэтому никогда не создавайте стили ячеек в одном и том же цикле, который устанавливает значения ячеек на листе.

Если необходимы две разные заливки ячейки (одна с красным, а другая с зеленым сплошным рисунком), тогда также необходимы два стиля ячейки,Их нужно сначала создать на уровне рабочей книги, а затем установить в качестве стиля ячейки в цикле, который устанавливает значения ячейки.

Ваш код не завершен, поэтому я могу только догадываться, чего именно вы пытаетесь достичь.

Надеюсь, вам поможет следующий минимальный, но полный пример:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CreateExcelCellStyleRedAndGreen {

 public static void main(String[] args) throws Exception {
  //Workbook workbook = new XSSFWorkbook();
  Workbook workbook = new HSSFWorkbook();

  CellStyle headerCellStyleRed = workbook.createCellStyle();
  CellStyle headerCellStyleGreen = workbook.createCellStyle();

  headerCellStyleRed.setWrapText(true);
  headerCellStyleRed.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  headerCellStyleRed.setAlignment(HorizontalAlignment.JUSTIFY);
  headerCellStyleRed.setVerticalAlignment(VerticalAlignment.CENTER);

  headerCellStyleGreen.cloneStyleFrom(headerCellStyleRed);

  headerCellStyleRed.setFillForegroundColor(IndexedColors.RED.getIndex());
  headerCellStyleGreen.setFillForegroundColor(IndexedColors.GREEN.getIndex());

  String[] arr = new String[] {
   "A Name of File.xml", 
   "B Name of File.xml*", 
   "C Name of File.xml", 
   "D Name of File.xml", 
   "E Name of File.xml*", 
   "F Name of File.xml"
  };

  int rowNum=1;
  int colNum=1;

  Sheet sheet = workbook.createSheet();

  for (int i = 0; i < arr.length; i++) {
   Row row = sheet.createRow(rowNum++);
   Cell cell = row.createCell(colNum);
   if (arr[i].contains("*")) {
    //RED
    cell.setCellStyle(headerCellStyleRed);
    cell.setCellValue(arr[i].replace(".xml*", ""));

   } else {
    //GREEN
    cell.setCellStyle(headerCellStyleGreen);
    cell.setCellValue(arr[i].replace(".xml", ""));
   }
   row.setHeightInPoints(50);
  }

  FileOutputStream out = null;
  if (workbook instanceof HSSFWorkbook) {
   out = new FileOutputStream("CreateExcelCellStyleRedAndGreen.xls");
  } else if (workbook instanceof XSSFWorkbook) {
   out = new FileOutputStream("CreateExcelCellStyleRedAndGreen.xlsx");
  }
  workbook.write(out);
  out.close();
  workbook.close();
 }
}
...