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

本教程基于Spire.XLS for Java库实现,该库专为Excel文件处理而设计。通过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();
}
}
逆向操作原因:正向删除会导致后续行号变化,可能引发漏删或错删问题。
典型用途:数据库导出数据清洗、模板占位行清理等场景。
行列复制支持单工作表内和跨工作表操作。
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();
}
}
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);
参数详解:
典型应用:多工作表表头同步、模板行批量生成等场景。
行列隐藏功能可保护敏感数据不被直接查看。
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