Java实现Excel行列插入与删除操作指南

作者:袖梨 2026-05-31

在Java开发中,动态操作Excel表格的行列是常见需求。本文将详细讲解如何通过代码实现Excel行列的增删改查,涵盖.xls和.xlsx格式处理,并附上可直接运行的完整示例。

Java 如何插入和删除 Excel 行和列

安装依赖

本教程基于Spire.XLS for Java库实现,该库专为Excel文件处理而设计。通过Maven仓库即可快速集成到项目中。

Maven依赖

<repositories>
    <repository>
        <id>com.e-iceblueid>
        <url>url>
    repository>
repositories><dependencies>
    <dependency>
        <groupId>e-icebluegroupId>
        <artifactId>spire.xlsartifactId>
        <version>14.12.0version>
    dependency>
dependencies>

一、插入行和列

表格编辑时经常需要新增行列,以下是具体实现方法。例如在第2行前插入新行:

import com.spire.xls.*;public class InsertRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 在第2行位置插入一行
        worksheet.insertRow(2);
        
        // 在第2列位置插入一列
        worksheet.insertColumn(2);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

批量操作可通过指定数量参数实现多行插入:

// 从第5行开始,连续插入2行
worksheet.insertRow(5, 2);// 从第5列开始,连续插入2列
worksheet.insertColumn(5, 2);

典型应用:根据数据记录数量动态插入对应行数,实现报表自动扩展。

二、删除行和列

删除操作需注意行列删除后索引会自动前移的特性。

import com.spire.xls.*;public class DeleteRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 从第5行开始,删除4行(删除第5、6、7、8行)
        worksheet.deleteRow(5, 4);
        
        // 从第2列开始,删除2列(删除第2、3列)
        worksheet.deleteColumn(2, 2);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

重要提示:循环删除多行时务必从后往前操作,避免索引错乱。

三、删除空白行和列

自动清理空白行列能显著提升表格整洁度。

import com.spire.xls.*;public class DeleteBlankRows {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("messy_data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 删除空白行(从后往前遍历)
        for (int i = sheet.getRows().length - 1; i >= 0; i--) {
            if (sheet.getRows()[i].isBlank()) {
                sheet.deleteRow(i + 1);  // 注意:行号从1开始
            }
        }
        
        // 删除空白列(从后往前遍历)
        for (int j = sheet.getColumns().length - 1; j >= 0; j--) {
            if (sheet.getColumns()[j].isBlank()) {
                sheet.deleteColumn(j + 1);  // 注意:列号从1开始
            }
        }
        
        workbook.saveToFile("cleaned.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

逆向操作原因:正向删除会导致后续行号变化,可能引发漏删或错删问题。

典型用途:数据库导出数据清洗、模板占位行清理等场景。

四、复制行和列

行列复制支持单工作表内和跨工作表操作。

同一Sheet内复制

import com.spire.xls.*;public class CopyRows {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 把第1行复制到第3行
        // 参数:源行、目标行、是否复制值、是否复制格式、是否复制公式
        sheet.copy(sheet.getRows()[0], sheet.getRows()[2], true, true, true);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2010);
        workbook.dispose();
    }
}

跨Sheet复制

Worksheet sheet1 = workbook.getWorksheets().get(0);
Worksheet sheet2 = workbook.getWorksheets().get(1);// 把Sheet1的第1行复制到Sheet2的第2行
sheet1.copy(sheet1.getRows()[0], sheet2.getRows()[1], true, true, true);

参数详解

  1. 第一个参数控制单元格值复制
  2. 第二个参数决定格式是否复制
  3. 第三个参数管理公式复制

典型应用:多工作表表头同步、模板行批量生成等场景。

五、隐藏和显示行列

行列隐藏功能可保护敏感数据不被直接查看。

import com.spire.xls.*;public class HideRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 隐藏第2列
        worksheet.hideColumn(2);
        
        // 隐藏第4行
        worksheet.hideRow(4);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

取消隐藏操作如下:

// 显示第2列
worksheet.showColumn(2);// 显示第4行
worksheet.showRow(4);

适用场景:财务报表中间计算过程隐藏、敏感信息保护等。

六、设置行高和列宽

自定义行列尺寸可优化表格显示效果。

import com.spire.xls.*;public class SetHeightWidth {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 设置第4列宽度为30
        worksheet.setColumnWidth(4, 30);
        
        // 设置第4行高度为30
        worksheet.setRowHeight(4, 30);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

批量设置默认值的方法:

// 设置所有行的默认高度
worksheet.setDefaultRowHeight(20);// 设置所有列的默认宽度
worksheet.setDefaultColumnWidth(15);

排版建议:中文内容需要更宽列宽,英文可适当缩小,根据实际内容调整效果最佳。

七、自动调整列宽

智能列宽调整功能可自动适配内容长度。

import com.spire.xls.*;public class AutoFitColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 自动调整指定区域的列宽
        worksheet.getAllocatedRange().autoFitColumns();
        
        // 也可以只调整某几列
        // worksheet.getCellRange("A1:C10").autoFitColumns();
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

性能提示:大数据量时自动调整可能较慢,建议对关键区域使用或预设固定宽度。

八、分组行列(大纲功能)

大纲功能可实现数据的层级展示与折叠。

import com.spire.xls.*;public class GroupRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 对第1到5行进行分组(可以折叠)
        // 第三个参数:是否在下方显示汇总行
        sheet.groupByRows(1, 5, false);
        
        // 对第1到3列进行分组
        sheet.groupByColumns(1, 3, false);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

典型应用:财务报表按月分组、项目计划分阶段展示等需要层级查看的场景。

九、根据条件删除行

按条件筛选删除特定行可快速清理数据。

import com.spire.xls.*;public class RemoveRowByKeyword {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        String keyword = "测试";
        
        // 从后往前遍历,删除包含关键词的行
        for (int i = sheet.getRows().length - 1; i >= 0; i--) {
            boolean shouldDelete = false;
            
            // 检查该行所有单元格
            for (Object cell : sheet.getRows()[i]) {
                if (cell != null && cell.toString().contains(keyword)) {
                    shouldDelete = true;
                    break;
                }
            }
            
            if (shouldDelete) {
                sheet.deleteRow(i + 1);
            }
        }
        
        workbook.saveToFile("filtered.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

应用场景:测试数据清理、无效记录过滤、标记行删除等数据预处理工作。

十、综合实战:动态生成报表

完整示例展示如何动态创建格式化的数据报表。

import com.spire.xls.*;
import java.util.List;
import java.util.ArrayList;public class DynamicReport {
    
    // 模拟数据类
    static class Product {
        String name;
        double price;
        int quantity;
        
        Product(String name, double price, int quantity) {
            this.name = name;
            this.price = price;
            this.quantity = quantity;
        }
    }
    
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 准备数据
        List products = new ArrayList<>();
        products.add(new Product("产品A", 99.9, 100));
        products.add(new Product("产品B", 199.9, 50));
        products.add(new Product("产品C", 299.9, 30));
        
        // 1. 写入表头
        String[] headers = {"产品名称", "单价", "数量", "总价"};
        for (int i = 0; i < headers.length; i++) {
            sheet.getCellRange(1, i + 1).setValue(headers[i]);
        }
        
        // 格式化表头
        sheet.getCellRange(1, 1, 1, headers.length).getStyle().getFont().isBold(true);
        sheet.getCellRange(1, 1, 1, headers.length).getStyle()
            .setKnownColor(ExcelColors.LightBlue);
        
        // 2. 动态插入数据行
        for (int i = 0; i < products.size(); i++) {
            int row = i + 2;  // 从第2行开始(第1行是表头)
            Product p = products.get(i);
            
            sheet.getCellRange(row, 1).setValue(p.name);
            sheet.getCellRange(row, 2).setNumberValue(p.price);
            sheet.getCellRange(row, 3).setNumberValue(p.quantity);
            
            // 总价 = 单价 * 数量(使用公式)
            sheet.getCellRange(row, 4).setFormula("=B" + row + "*C" + row);
            sheet.getCellRange(row, 4).getStyle().setNumberFormat("¥#,##0.00");
        }
        
        // 3. 添加汇总行
        int summaryRow = products.size() + 2;
        sheet.getCellRange(summaryRow, 1).setValue("合计");
        sheet.getCellRange(summaryRow, 1).getStyle().getFont().isBold(true);
        
        // 汇总公式
        sheet.getCellRange(summaryRow, 3).setFormula("=SUM(C2:C" + (summaryRow - 1) + ")");
        sheet.getCellRange(summaryRow, 4).setFormula("=SUM(D2:D" + (summaryRow - 1) + ")");
        sheet.getCellRange(summaryRow, 4).getStyle().setNumberFormat("¥#,##0.00");
        
        // 4. 设置列宽
        sheet.setColumnWidth(1, 20);  // 产品名称
        sheet.setColumnWidth(2

相关文章

精彩推荐