Java解析Excel并对特定内容做解析成功与否的颜色标记

JAVA解析EXCEL文件的时候,根据解析内容是否满足业务需求,修改原始EXCEL某个解析字段的背景色来提示用户具体解析存在问题的内容,便于用户重新修改并再次上传EXCEL。

Java完全可以做到在解析Excel的同时,修改某个字段(单元格)的背景色。这是处理数据报表、数据标记等任务的常见需求。

最主流和强大的库是 Apache POI,它提供了对Excel文件(包括旧版.xls和新版.xlsx)进行读、写和样式修改的完整能力。

核心技术: Apache POI

下面的示例展示了如何使用Apache POI来读取一个Excel文件,并根据条件修改特定单元格的背景色。

java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelColorModifier {

    public static void modifyCellBackground(String filePath, int sheetIndex, int rowNum, int colNum) throws IOException {
        // 1. 根据文件后缀创建Workbook对象 (兼容.xls和.xlsx)
        Workbook workbook;
        try (FileInputStream fileIn = new FileInputStream(filePath)) {
            if (filePath.toLowerCase().endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(fileIn);
            } else if (filePath.toLowerCase().endsWith(".xls")) {
                workbook = new HSSFWorkbook(fileIn);
            } else {
                throw new IllegalArgumentException("Unsupported file format. Please use .xls or .xlsx");
            }
        }

        // 2. 获取指定的Sheet和Cell
        Sheet sheet = workbook.getSheetAt(sheetIndex); // 获取第一个工作表
        Row row = sheet.getRow(rowNum); // 获取行 (注意行号从0开始)
        if (row == null) {
            row = sheet.createRow(rowNum); // 如果行不存在则创建
        }
        Cell cell = row.getCell(colNum,    Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); // 获取单元格,不存在则创建

        // 3. 创建一个新的单元格样式(通常建议创建新样式,避免影响其他单元格)
        CellStyle newStyle = workbook.createCellStyle();
        // 可选:复制原有样式,再修改背景色,以保留原有字体、边框等设置
        // newStyle.cloneStyleFrom(cell.getCellStyle());

        // 4. 设置背景色(填充方式为纯色填充)
        newStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        // 这里设置为亮黄色
        newStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());

        // 5. 将新样式应用到指定单元格
        cell.setCellStyle(newStyle);

        // 6. 写回文件,保存修改
        try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
            workbook.write(fileOut);
        }

        // 7. 关闭工作簿释放资源
        workbook.close();

        System.out.println("单元格背景色修改完成并已保存!");
    }

    public static void main(String[] args) {
        try {
        // 示例:修改"D:\data.xlsx"文件,第一个工作表(0),第2行(1),第3列(2)的单元格背景色
            modifyCellBackground("D:\\data.xlsx", 0, 1, 2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键步骤与要点说明

  1. 依赖引入 :首先需要在你的项目中添加Apache POI的依赖。
    • Maven 项目 在 pom.xml 中添加:
XML 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version> <!-- 请使用最新稳定版本 -->
</dependency>
<!-- 处理.xlsx文件需要此模块 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

样式管理

  • 不要循环创建样式 :如果在循环中为大量单元格设置样式,务必在循环外创建 CellStyle 对象,然后在循环内复用。在循环内部重复 workbook.createCellStyle() 会导致内存急剧增长和文件体积膨胀。

颜色选择 :IndexedColors 提供了预定义的56种颜色。如果需要自定义RGB颜色(仅限 .xlsx 文件),可以使用:

java 复制代码
// 仅适用于XSSFWorkbook (.xlsx)
XSSFColor customColor = new XSSFColor(new java.awt.Color(255, 200, 200), new DefaultIndexedColorMap());
((XSSFCellStyle) newStyle).setFillForegroundColor(customColor);
  1. 性能与内存
    • 对于非常大的文件(.xlsx),使用 SXSSFWorkbook 进行流式处理,可以避免将整个文件加载到内存,但修改样式的方式会略有不同。
  2. 文件格式
    • 代码示例已兼容 .xls (HSSF) 和 .xlsx (XSSF) 格式,但注意两者在样式数量和功能支持上存在细微差异。

💡 更实用的场景:基于解析内容的条件性高亮

通常,修改背景色是基于单元格的内容。以下是一个简单的逻辑示例,遍历第一列,将值为"警告"的单元格背景设为红色:

java 复制代码
for (Row row : sheet) {
    Cell cell = row.getCell(0); // 获取第一列单元格
    if (cell != null && cell.getCellType() == CellType.STRING) {
        if ("警告".equals(cell.getStringCellValue().trim())) {
            CellStyle alertStyle = workbook.createCellStyle();
            alertStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            alertStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
            cell.setCellStyle(alertStyle);
        }
    }
}
相关推荐
{Hello World}2 小时前
Java多态:三大条件与实现详解
java·开发语言
lang201509282 小时前
Java反射利器:Apache Commons BeanUtils详解
java·开发语言·apache
m0_748245922 小时前
SQLite 数据类型概述
java·数据库·sqlite
沐知全栈开发2 小时前
HTML DOM 方法
开发语言
扶苏10022 小时前
前端js高频面试点汇总
开发语言·前端·javascript
项目題供诗2 小时前
C语言基础(五)
c语言·开发语言
Mh_ithrha2 小时前
题目:小鱼比可爱(java)
java·开发语言·算法
l1t2 小时前
数独优化求解C库tdoku-lib的使用
c语言·开发语言·python·算法·数独
wxm6312 小时前
力扣算法题(C++):1、2
java·算法·leetcode