
在处理大型 Excel 文件时,数据量过大不仅可能导致软件启动缓慢、操作卡顿,还会给团队协作带来不便。例如,当一个总表包含所有业务数据时,不同部门往往只需要处理其职责相关的部分,共享同一个大文件不仅效率低下,还可能存在数据安全隐患。
因此,文件拆分就变得尤为重要。由于手动拆分既费时费力又容易出错,本文将带你了解如何利用 Spire.XLS for Java,通过 Java 自动拆分 Excel 文件,轻松解决文件臃肿和协作受限的问题。
一、 Spire.XLS for Java 介绍与安装
Spire.XLS for Java 是一款专业的 Java Excel 组件,它可以帮助开发人员在不安装 Microsoft Office 的情况下,直接通过代码创建、读取、编辑和转换 Excel 文件。对于拆分 Excel 文件这类任务也可以做到灵活按照工作表拆分或按照行、列进行拆分。
下载与安装
如果你使用 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.1.3</version>
</dependency>
</dependencies>
你可以下载 Spire.XLS 进行自定义安装。同时,该库还提供免费版用于测试或小型项目。
二、 Java 按工作表拆分 Excel 为独立文件
当一个工作簿中包含多个工作表,且每个表代表不同的数据,如不同部门或月份时,我们可以将每个工作表拆分并保存为独立的 Excel 文件。Spire.XLS 通过遍历源文件中的所有工作表,创建新的工作簿,并拷贝当前工作表来完成这个任务。下方为具体的操作步骤:
- 创建 Workbook 类的对象并使用 Workbook.loadFromFile() 加载 Excel 源文档。
- 声明 Workbook 和 String 变量。
- 遍历源文档中的所有工作表。
- 创建新的 Workbook 对象,删除默认工作表。
- 通过 Workbook.getWorksheets().addCopy() 方法,将源文档中的工作表复制到新工作簿中。
- 调用 Workbook.getWorksheets().get().getName() 方法获取工作表的名称,并应用到复制后的表格。
- 通过 Workbook.saveToFile() 方法保存新的工作簿为 Excel 文件。
下面是一个完整的代码示例,展示了将工作表拆分为多个独立的 Excel 文件:
import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;
public class SplitExcel {
public static void main(String[] args) {
// 创建 Workbook 对象
Workbook wb = new Workbook();
// 加载 Excel 文档
wb.loadFromFile("/input/世界各洲人口前十国家.xlsx");
// 声明 Workbook 变量
Workbook newWb;
// 声明 String 类型变量
String sheetName;
// 指定拆分生成的文档的存放路径
String folderPath = "/output/按表拆分/";
// 遍历所有工作表
for (int i = 0; i < wb.getWorksheets().getCount(); i++) {
// 初始化 Workbook 对象
newWb = new Workbook();
// 删除默认工作表
newWb.getWorksheets().clear();
// 将源文档中的指定工作表复制到新的 Workbook
newWb.getWorksheets().addCopy(wb.getWorksheets().get(i));
// 获取工作表表名
sheetName = wb.getWorksheets().get(i).getName();
// 将新的 Workbook 保存为 Excel 文档
newWb.saveToFile(folderPath + sheetName + ".xlsx", FileFormat.Version2013);
}
}
}
Excel 拆分结果预览:

提示:如果你想要合并多个 Excel 文件,Spire.XLS 也是支持的,请参考:通过 Java 合并 Excel 工作簿 >>
三、 Java 按行拆分 Excel 文件
在 Excel 文件处理中,按行拆分常用于将大型明细表拆分为多份独立数据。例如,将 1-10 行保存为一个文件,11-20 行保存为另一个文件,以实现对数据的针对性处理。Spire.XLS 主要通过 Worksheet.copyRow() 方法配合循环遍历来完成这个目标。下方是详细的代码步骤:
- 创建 Workbook 类的对象,并使用 Workbook.loadFromFile() 方法加载 Excel 源文件。
- 通过 Workbook.getWorksheets().get() 方法获取源工作表。
- 创建新的 Workbook 对象,并清除默认工作表。
- 使用 Workbook.getWorksheets().add() 方法为新工作簿添加一个新工作表。
- 使用 Worksheet.copyRow() 方法将特定行从原始工作表复制到新工作表,并将列宽也复制到新工作表。
- 使用 Workbook.saveToFile() 方法将新工作簿保存为单独的 Excel 文件。
下方代码展示了怎样将 Excel 文件中,第一个工作表的 1-5 行、6-10 行分别拆分为两个单独的文件:
import com.spire.xls.*;
import java.util.EnumSet;
public class spiltexcel {
public static void main(String[] args) {
// 设置文件的输入和输出路径
String sourceFile = "/input/世界各洲人口前十国家.xlsx";
String folderPath = "/output/";
// 创建一个 Workbook 类的对象并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile(sourceFile);
// 获取源文件的第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 创建新的工作簿作为目标文件并清除默认工作表
Workbook newWorkbook1 = new Workbook();
newWorkbook1.getWorksheets().clear();
// 在目标文件新增一个工作表
Worksheet newSheet1 = newWorkbook1.getWorksheets().add("Sheet1");
// 将源文件第一个工作表的第1-5行复制到目标文件中
int destRow1 = 1;
for (int i = 0; i < 5; i++) {
sheet.copyRow(sheet.getRows()[i], newSheet1, destRow1++, EnumSet.of(CopyRangeOptions.All));
}
copyColumnWidths(sheet, newSheet1);
newWorkbook1.saveToFile(folderPath + "1-5行.xlsx", ExcelVersion.Version2016);
// 创建新的工作簿作为目标文件 2 并清除默认工作表
Workbook newWorkbook2 = new Workbook();
newWorkbook2.getWorksheets().clear();
// 在目标文件 2 新增一个工作表
Worksheet newSheet2 = newWorkbook2.getWorksheets().add("Sheet1");
int destRow2 = 1;
// 复制表头
sheet.copyRow(sheet.getRows()[0], newSheet2, destRow2++, EnumSet.of(CopyRangeOptions.All));
// 将源文件第一个工作表的第6-10行复制到目标文件中
for (int i = 5; i < 10; i++) {
sheet.copyRow(sheet.getRows()[i], newSheet2, destRow2++, EnumSet.of(CopyRangeOptions.All));
}
copyColumnWidths(sheet, newSheet2);
newWorkbook2.saveToFile(folderPath + "6-10行.xlsx", ExcelVersion.Version2016);
}
private static void copyColumnWidths(Worksheet source, Worksheet dest) {
for (int i = 0; i < source.getColumns().length; i++) {
dest.setColumnWidth(i + 1, source.getColumnWidth(i + 1));
}
}
}
Excel 拆分结果预览:

提示:代码中已经内置了将源文档列宽复制到新表的操作,这并非必要步骤。拆分完成后,你也可以自行调整行高和列宽,以更好地控制表格布局,提高可读性和展示效果。
四、 Java 按列拆分 Excel 文件
当表格列数较多、字段信息复杂时,按列拆分 Excel 往往比按行处理更直观也更安全。这种方式既能减少无关字段的干扰,也有助于数据权限隔离。与按行拆分的处理方式类似,Spire.XLS 主要使用 Worksheet.copyColumn() 方法和循环遍历来拆分不同列,并将它们分别保存为独立的文件。下方为具体的步骤:
- 创建 Workbook 类的对象,并使用 Workbook.loadFromFile() 方法加载 Excel 源文件。
- 通过 Workbook.getWorksheets().get() 方法获取源工作表。
- 创建新的 Workbook 对象,并清除默认工作表。
- 使用 Workbook.getWorksheets().add() 方法为新工作簿添加一个新工作表。
- 使用 Worksheet.copyColumn() 方法将特定列从原始工作表复制到新工作表。
- 使用 Workbook.saveToFile() 方法将新工作簿保存为单独的 Excel 文件。
下方代码展示了怎样将 Excel 文件中,第一个工作表的 1-2 列和 3-4 列拆分出来并保存为单独的文件:
import com.spire.xls.*;
import java.util.EnumSet;
public class SplitExcel {
public static void main(String[] args) {
// 创建 Workbook 对象并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile("/input/世界各洲人口前十国家.xlsx");
// 获取原始(第一个)工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
// 指定生成的 Excel 文件的文件夹路径
String folderPath = "/output/";
// 创建新的 Workbook,删除默认工作表并添加新的工作表
Workbook newWorkbook1 = new Workbook();
newWorkbook1.getWorksheets().clear();
Worksheet newWorksheet1 = newWorkbook1.getWorksheets().add("Sheet1");
// 从原始工作表复制第 1-2 列到新工作表
for (int i = 1; i <= 2; i++) {
// 参数:源列,目标表,目标起始列索引,复制选项
worksheet.copyColumn(worksheet.getColumns()[i - 1], newWorksheet1, newWorksheet1.getLastDataColumn() + 1, EnumSet.of(CopyRangeOptions.All));
}
// 复制行高以保持样式一致
for (int i = 0; i < worksheet.getRows().length; i++) {
newWorksheet1.setRowHeight(i + 1, worksheet.getRowHeight(i + 1));
}
newWorkbook1.saveToFile(folderPath + "AB列.xlsx", ExcelVersion.Version2016);
newWorkbook1.dispose();
// 创建新的 Workbook,删除默认工作表并添加新的工作表
Workbook newWorkbook2 = new Workbook();
newWorkbook2.getWorksheets().clear();
Worksheet newWorksheet2 = newWorkbook2.getWorksheets().add("Sheet1");
// 从原始工作表复制第 3-4 列到新工作表
for (int i = 3; i <= 4; i++) {
worksheet.copyColumn(worksheet.getColumns()[i - 1], newWorksheet2, newWorksheet2.getLastDataColumn() + 1, EnumSet.of(CopyRangeOptions.All));
}
// 复制行高
for (int i = 0; i < worksheet.getRows().length; i++) {
newWorksheet2.setRowHeight(i + 1, worksheet.getRowHeight(i + 1));
}
newWorkbook2.saveToFile(folderPath + "CD列.xlsx", ExcelVersion.Version2016);
newWorkbook2.dispose();
}
}
输出文件预览:

总结
通过 Spire.XLS for Java,我们可以从工作表、行、列三个维度对冗长的 Excel 文件进行精准拆分。这不仅解决了大文件打开慢的问题,更实现了数据的解构,让不同部门能够专注于自身业务,极大地提升了团队的协同效率。如果你对 Spire.XLS 感兴趣,或有任何疑问,欢迎随时联系我们!







