使用 Java 高效删除 Excel 空白行与空白列

在数据处理和自动化办公的场景中,我们经常需要处理从数据库导出、用户填报或第三方系统生成的 Excel 文件。这些文件往往包含大量的"脏数据",其中最常见的就是空白行和空白列。

这些无效数据不仅影响报表的美观,更会严重干扰后续的数据分析、统计公式计算以及导入系统的准确性。手动在 Excel 中筛选并删除成千上万行数据既耗时又容易出错。

本文将介绍如何通过 Java 代码自动检测并删除 Excel 中的空白行和空白列。


环境准备

在开始编写代码之前,请确保你的项目中已经引入了 Spire.XLS for Java 依赖。如果你使用 Maven 项目,可以在 pom.xml 中添加以下依赖:

复制代码
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>16.2.6</version>
    </dependency>
</dependencies>

如果是非 Maven 项目,可以去官方网站下载 JAR 包并手动添加到项目中。


核心逻辑解析

在编写代码前,我们需要理解一个关键的技术细节:倒序遍历

当我们删除行或列时,后续行或列的索引会发生改变。

  • 如果我们从第 1 行遍历到最后一行,删除了第 3 行,那么原来的第 4 行会变成新的第 3 行。如果循环继续向下走到第 4 行,实际上我们跳过检查了原来的第 4 行(现在的第 3 行)。
  • 解决方案 :从最后一行(或最后一列)开始,倒序向前遍历。这样即使删除了当前行,也不会影响尚未检查的前面行的索引。

Spire.XLS 提供了便捷的 isBlank() 方法来判断一行或一列是否完全为空,大大简化了判断逻辑。


示例一:删除 Excel 中的空白行

这个示例演示如何加载一个 Excel 文件,遍历所有已使用的行,检测并删除那些没有任何数据的空行。

代码实现

复制代码
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class DeleteBlankRows {

    public static void main(String[] args) {
        // 1. 创建 Workbook 对象
        Workbook wb = new Workbook();

        // 2. 加载示例 Excel 文档
        // 请确保当前项目目录下存在 "sample.xlsx" 文件
        wb.loadFromFile("sample.xlsx");

        // 3. 获取第一个工作表
        Worksheet sheet = wb.getWorksheets().get(0);

        // 4. 倒序遍历所有已使用的行
        // getLastRow() 返回最后一行有内容的行号(包含格式或数据)
        // 我们从最后一行开始,一直循环到第 1 行
        for (int i = sheet.getLastRow(); i >= 1; i--) {
            
            // 5. 检测当前行是否为空白
            // getRows()[i-1] 获取第 i 行的对象(数组索引从 0 开始,所以是 i-1)
            // isBlank() 方法判断该行是否没有任何数据或格式
            if (sheet.getRows()[i - 1].isBlank()) {
                
                // 6. 如果为空白,则删除该行
                // deleteRow(i) 删除第 i 行
                sheet.deleteRow(i);
                System.out.println("已删除空白行: " + i);
            }
        }

        // 7. 保存结果文档
        wb.saveToFile("DeleteBlankRows_Only.xlsx", ExcelVersion.Version2016);
        
        System.out.println("空白行清理完成!文件已保存。");
    }
}

关键点说明

  • sheet.getLastRow(): 获取工作表中最后一个被使用过的行号。这比遍历整个工作表的最大行数(如 1048576 行)要高效得多。
  • sheet.getRows()[i-1] : 注意 Java 数组索引是从 0 开始的,而 Excel 行号是从 1 开始的,因此访问第 i 行时需要使用 i-1
  • isBlank() : 这是 Spire.XLS 的核心判断方法。它不仅检查单元格是否有文本或数字,通常也会考虑是否包含公式或对象。如果整行都是空的,返回 true

示例二:删除 Excel 中的空白列

逻辑与删除行非常相似,只是操作对象从"行(Row)"变成了"列(Column)",遍历方向从"行号"变成了"列号"。

代码实现

复制代码
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class DeleteBlankColumns {

    public static void main(String[] args) {
        // 1. 创建 Workbook 对象
        Workbook wb = new Workbook();

        // 2. 加载示例 Excel 文档
        wb.loadFromFile("sample.xlsx");

        // 3. 获取第一个工作表
        Worksheet sheet = wb.getWorksheets().get(0);

        // 4. 倒序遍历所有已使用的列
        // getLastColumn() 返回最后一列有内容的列号
        for (int j = sheet.getLastColumn(); j >= 1; j--) {
            
            // 5. 检测当前列是否为空白
            // getColumns()[j-1] 获取第 j 列的对象
            if (sheet.getColumns()[j - 1].isBlank()) {
                
                // 6. 如果为空白,则删除该列
                sheet.deleteColumn(j);
                System.out.println("已删除空白列: " + getColumnName(j));
            }
        }

        // 7. 保存结果文档
        wb.saveToFile("DeleteBlankColumns_Only.xlsx", ExcelVersion.Version2016);
        
        System.out.println("空白列清理完成!文件已保存。");
    }

    // 辅助方法:将列号转换为 Excel 列名(如 1 -> A, 2 -> B)
    private static String getColumnName(int columnNumber) {
        int dividend = columnNumber;
        String columnName = "";
        while (dividend > 0) {
            int modulo = (dividend - 1) % 26;
            columnName = (char)('A' + modulo) + columnName;
            dividend = (dividend - modulo) / 26;
        }
        return columnName;
    }
}

关键点说明

  • sheet.getLastColumn(): 获取工作表中最后一个被使用过的列号。
  • sheet.deleteColumn(j): 删除指定的列,右侧的列会自动向左移动填补空缺。
  • 辅助方法 : 为了日志输出更友好,我添加了一个 getColumnName 方法,将数字列号转换为熟悉的 "A", "B", "C" 格式,方便调试。

常见问题与注意事项

1. 性能优化

对于超大型 Excel 文件(几十万行),Java 的内存消耗可能会增加。

  • 确保在操作完成后调用 wb.dispose()来帮助垃圾回收。
  • 尽量避免在循环内部进行频繁的 IO 操作,上面的示例只在最后保存一次,这是最佳实践。

2. 备份原始文件

自动化脚本具有破坏性(直接删除数据)。在生产环境中运行此类代码前,务必备份原始文件,或者将结果保存为新文件名,以防误删重要数据。


总结

通过使用 Java 我们可以轻松实现 删除 Excel 中的空白行和空白列,减少人工操作带来的失误,并提升工作效率。

希望这篇文章能为你的 Java Excel 开发工作带来帮助!

相关推荐
笨手笨脚の2 小时前
Java 性能优化
java·jvm·数据库·性能优化·分布式锁·分布式事务·并发容器
l软件定制开发工作室2 小时前
Spring开发系列教程(32)——Spring Boot开发
java·spring boot·后端·spring
DolphinScheduler社区2 小时前
Apache DolphinScheduler 3.4.1 发布,新增任务分发超时检测
java·数据库·开源·apache·海豚调度·大数据工作流调度
黑眼圈子2 小时前
Java正则表达式基础知识
java·开发语言·正则表达式
iPadiPhone2 小时前
性能优化的“快车道”:Spring @Async 注解深度原理与大厂实战
java·后端·spring·面试·性能优化
彭于晏Yan2 小时前
JsonProperty注解的access属性
java·spring boot
Mr.朱鹏2 小时前
分布式-redis集群架构
java·redis·分布式·后端·spring·缓存·架构
予枫的编程笔记2 小时前
【面试专栏|Java并发编程】Java并发锁对比:synchronized与Lock,底层原理+适用场景详解
java·synchronized·java面试·java并发编程·并发锁·面试干货·lock接口
醇氧2 小时前
PowerPoint 批量转换为 PDF
java·spring boot·spring·pdf·powerpoint