当前位置: 首页 > 知识库问答 >
问题:

带有Apache POI 4的XSSFColor:单元格背景颜色被另一个单元格背景颜色覆盖

钮实
2023-03-14

我正在使用Apache POI 4.1.2运行以下代码:

        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sheet = wb.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);
        cell.setCellValue("Cell one");

        XSSFCellStyle style = wb.createCellStyle();
        Color green = new Color(20, 230, 18);
        style.setFillForegroundColor(new XSSFColor(green, new DefaultIndexedColorMap()));
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellStyle(style);

        cell = row.createCell(1);
        cell.setCellValue("cell two");
        Color red = new Color(200, 30, 18);
        style.setFillForegroundColor(new XSSFColor(red, new DefaultIndexedColorMap()));
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellStyle(style);

        File outFile = new File(OUTPUT_DIR + "colors.xlsx");
        outFile.getParentFile().mkdirs();
        try (OutputStream fileOut = new FileOutputStream(outFile)) {
            wb.write(fileOut);
        }
        wb.close();

输出文档包含两个具有红色背景的单元格:似乎在第二个单元格上设置红色背景具有覆盖第一个单元格背景颜色的效果。

如果仅在第一个单元格上设置背景,则背景颜色将正确设置为绿色。

我如何解决这个问题?

共有1个答案

法玮
2023-03-14

颜色不存储在单元格中,而是存储在单元格样式中。因此,您需要创建尽可能多的单元格样式和颜色。

但也不要简单地为每个单元格创建单元格样式。Excel对唯一单元格格式/单元格样式的最大数量有限制。如果超过该限制,则工作簿将损坏。

因此,在工作簿级别根据需要创建尽可能多的单元格样式。然后应用这些单元格样式,同时将单元格值填充到工作表中。

完整示例:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.util.List;
import java.util.ArrayList;

public class CreateExcelDifferentCellColors {

 public static void main(String[] args) throws Exception {
  XSSFWorkbook workbook = new XSSFWorkbook(); 
  
  // on workbook level create as much CellStyles as needed
  XSSFCellStyle greenCellStyle = workbook.createCellStyle();
  java.awt.Color green = new java.awt.Color(20, 230, 18);
  greenCellStyle.setFillForegroundColor(new XSSFColor(green, new DefaultIndexedColorMap()));
  greenCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);  
  
  XSSFCellStyle redCellStyle = workbook.createCellStyle();
  java.awt.Color red = new java.awt.Color(200, 30, 18);
  redCellStyle.setFillForegroundColor(new XSSFColor(red, new DefaultIndexedColorMap()));
  redCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        
  XSSFSheet sheet = workbook.createSheet(); 

  List<Number> numbers = new ArrayList<Number>();
  numbers.add(12); numbers.add(-12); numbers.add(12.1); numbers.add(-12.1); numbers.add(12.123); numbers.add(-12.123);

  int r = 0;
  for (Number number : numbers) {
   XSSFRow row = sheet.createRow(r++); 
   XSSFCell cell = row.createCell(0); 
   cell.setCellValue(number.doubleValue());
   if (number.doubleValue() < 0d) {
    cell.setCellStyle(redCellStyle);
   } else {
    cell.setCellStyle(greenCellStyle);   
   }
  } 

  FileOutputStream out = new FileOutputStream("./CreateExcelDifferentCellColors.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();
 }
}
 类似资料:
  • 问题内容: 我正在尝试使用渲染器为jTable的单元格上色,但是它们工作不佳,因为它们滞后于表格并且无法看到。这是我的代码: 我没有将其放入rendererclass中,因为它滞后了,我将其放入cicle的双精度中,具体地说,放入了第二个cicle。我希望它为超过24的单元格上色,如果现在我写的话,那是行不通的 它使桌子完全着色 编辑 按照要求,我创建了一个描述我的问题的小示例,我不知道是否存在发

  • 我如何在Vaadin 8或更高版本中绘制网格单元。由于Vaadin 8不再支持grid.setCellStyleGenerator,我不知道还能做什么。有什么建议吗?

  • 有人知道如何更改ZK网格中单元格的背景色吗?在网上搜索了几个小时,找不到太多。静态单元格不是问题,但这是动态渲染的网格。 计划是将某些细胞涂成红色或黄色,因为我想突出显示特定的值。 我的Zul: 我的虚拟机:

  • 我想改变JTable的单元格背景颜色,想从MySQL数据库中获取数据。 我在MySQL中使用一个数据表,它有一个状态字段。如果状态为1,则单元格背景颜色应为红色;如果状态为0,则应更改为红色。