buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

POI设置Excel行或单元格的背景色

POI:set background color for a row or a cell.

use setFillForegroundColor and setFillPattern at the same.

Note that not setFillBackgroundColor.

XSSFCellStyle newstyle = wb.createCellStyle();
newstyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
newstyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

 

POI:set the last sheet selected, use setActiveSheet method.

XSSFWorkbook wb = new XSSFWorkbook(inputStream);
...
wb.setActiveSheet(newExcelCreat.getNumberOfSheets() - 1);

 

利用POI清空excel文件

就是说,删掉指定excel文件里的所有sheet页。

 

🍀方法一(不推荐)

这种方式,虽然删掉了所有sheet,但是excel文件大小没变。可能是因为删除工作表并不会立即释放文件所占用的空间。在Excel中,删除工作表只是将其标记为删除,但实际上并没有从文件中删除相关数据。所以,欠妥!

public static void removeAllSheets(File excelFile) {
    XSSFWorkbook workbook= null;
    try {
        workbook = new XSSFWorkbook(new FileInputStream(excelFile));
        
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i = numberOfSheets - 1; i >= 0; i--) {
            workbook.removeSheetAt(i);
        }
        workbook.createSheet("Sheet1");

        FileOutputStream fileOut = new FileOutputStream(excelFile);
        workbook.write(fileOut);
        fileOut.flush();
        fileOut.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
View Code

 

🍀方法二(推荐)

直接创建一个新的Workbook对象,然后写入到文件里。相当于重新创建了一个同名的文件,里面只有一个默认的Sheet1,文件大小是4k。

public static void truncateFile(File excelFile) {
    try {
        XSSFWorkbook workbook = new XSSFWorkbook();
        workbook.createSheet("Sheet1");
        FileOutputStream fileOut = new FileOutputStream(excelFile);
        workbook.write(fileOut);

        fileOut.flush();
        fileOut.close();
        workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
}

 

POI: 易混淆的 setFillForegroundColor 与 setFillBackgroundColor

理解 setFillForegroundColorsetFillBackgroundColor 的区别对于正确设置POI单元格样式至关重要。简单来说,前景色通常才是我们想要设置的单元格填充色,而背景色的表现则强烈依赖于所选的填充图案。

下表清晰地展示了两者的核心区别。

特性setFillForegroundColorsetFillBackgroundColor
主要作用 设置填充图案的主颜色 设置填充图案的背景色次要颜色
常用场景 设置单元格的实心填充色(配合 SOLID_FOREGROUND 在特定的图案(如点状、条纹)下显示为图案的底色或第二颜色
生效条件 必须通过 setFillPattern 设置NO_FILL 的填充模式 必须通过 setFillPattern 设置能显示背景色的复杂填充模式(如 BIG_SPOTS, FINE_DOTS 等)
直观理解 画刷的颜色 画板的颜色(仅当画刷图案非实心时可见)

🧪 关键机制:填充模式的决定性作用

这两个方法是否能起作用,完全取决于 setFillPattern 方法所设置的填充模式 (FillPatternType)。

  • 当模式为 SOLID_FOREGROUND(实心填充)时 这是最常用的情况。在此模式下,只有前景色会生效,背景色会被忽略。这解释了为什么在大多数试图设置单元格纯色背景的代码中,只看到设置前景色。

    // 正确设置单元格为淡蓝色的方法:设置前景色 + 实心填充模式
    CellStyle style = workbook.createCellStyle();
    style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); // 主颜色生效
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 关键步骤
  • 当模式为复杂图案时 如果设置了一个复杂的填充模式,例如 BIG_SPOTS(大斑点)或 FINE_DOTS(细点),前景色和背景色会共同作用。前景色构成图案本身,而背景色则显示为图案之间的底色。

    // 设置一个由蓝色斑点和黄色背景构成的图案
    style.setFillForegroundColor(IndexedColors.BLUE.getIndex()); // 斑点为蓝色
    style.setFillBackgroundColor(IndexedColors.YELLOW.getIndex()); // 背景为黄色
    style.setFillPattern(FillPatternType.BIG_SPOTS); // 使用斑点图案

excel单元格效果如下:

💡 实践建议与常见误区

  1. 如何设置纯色单元格?

    **忘记 setFillBackgroundColor。正确的做法是:只调用 setFillForegroundColor 并搭配 FillPatternType.SOLID_FOREGROUND**。

  2. 为什么我设置了颜色却没效果?

    这是一个非常常见的错误。**根本原因通常是忘记了调用 setFillPattern 或者将其设置为了 NO_FILL**。没有指定填充模式,POI 就不会进行任何填充渲染。

  3. IndexedColors 的限制

    IndexedColors 是POI预定义的颜色调色板中的一种。如果这些颜色无法满足需求,对于 .xlsx 格式(XSSFWorkbook),可以使用 XSSFColor 来自定义RGB颜色,获得更精准的色彩。

💎 总结

可以这样记忆:

  • 想给单元格刷上一个纯色?请用 setFillForegroundColor 并选择 SOLID_FOREGROUND 模式。
  • 想设计一个有特定图案的填充?才需要同时使用 setFillForegroundColorsetFillBackgroundColor,并选择相应的图案模式。

[The End.]

posted on 2021-12-05 22:42  buguge  阅读(2034)  评论(0)    收藏  举报