使用 Java 拆分 Excel:Spire.XLS for Java 实战教程
在日常数据处理中,Excel 文件承载着海量信息。然而,面对包含多工作表、超长行数或需要按特定列进行分类的巨型 Excel 文件时,手动拆分无疑是一场噩梦,效率低下且容易出错。作为开发者,我们追求自动化和效率。本文将深入探讨如何利用 Java 强大的编程能力,结合 Spire.XLS for Java 库,高效、精准地完成 Excel 文件的拆分任务,让数据处理变得轻而易举。无论您是需要将一个 Excel 文件按工作表拆分为多个独立文件,还是需要将一个工作表按行或按列拆分成更小的单元,本教程都将为您提供清晰、可操作的解决方案。 Spire.XLS for Java 是一个功能全面、高性能的 Java Excel API,允许开发者在 Java 应用程序中创建、读取、编辑、转换和打印 Excel 文件。它支持多种 Excel 格式(XLS、XLSX、CSV、ODS 等),提供了丰富的特性,包括但不限于单元格操作、样式设置、图表、数据透视表、公式计算等。对于 Excel 拆分这种常见的自动化需求,Spire.XLS for Java 提供了直观且强大的 API 接口。 要在您的 Java 项目中使用 Spire.XLS for Java,最便捷的方式是通过 Maven 添加其依赖。 Maven: 将上述配置添加到您的 最常见的拆分需求是将一个包含多个工作表的 Excel 文件,拆分成多个独立的 Excel 文件,每个文件只包含原文件中的一个工作表。 关键代码解析: 当单个工作表数据量过大时,我们可能需要将其按行数或特定条件拆分成多个工作表或新的 Excel 文件。这里演示按固定行数拆分。 关键代码解析: 除了按行拆分,有时我们还需要将一个工作表按列拆分成多个文件,例如将原始数据按某些关键列进行分组。这里演示按固定列数拆分。 关键代码解析: 通过本文的详细教程,我们深入了解了如何利用 Spire.XLS for Java 库在 Java 应用程序中高效地拆分 Excel 文件。无论是按工作表、按行还是按列进行拆分,Spire.XLS for Java 都提供了简洁而强大的 API,极大地简化了复杂的 Excel 处理任务。它的高性能和丰富功能使其成为 Java 开发者处理 Excel 文件的理想选择。希望这些示例代码能帮助您在实际项目中实现 Excel 自动化处理,提升工作效率。鼓励大家尝试探索 Spire.XLS for Java 的更多功能,发现它在数据处理领域的无限潜力!一、Spire.XLS for Java 简介与环境配置
1. 安装依赖
<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>pom.xml 文件中,然后重新加载项目依赖即可。二、按工作表拆分 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);
}
}
}workbook.loadFromFile("input.xlsx"):加载待处理的 Excel 文件。workbook.getWorksheets().getCount():获取工作表的总数。workbook.getWorksheets().get(i):获取指定索引的工作表。newWb.getWorksheets().addCopy():将原始工作表复制到新创建的 Workbook 对象中。newWorkbook.saveToFile(outputFileName):将包含单个工作表的新工作簿保存为独立文件。三、按行拆分 Excel 工作表
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));
}
}
}sheet.getRows():获取源工作表的指定行。sheet.copyRow():将刚才获取到的行复制到新的工作表中。rowsPerSheet 行的数据(包括标题行)到一个新的工作簿中。saveToFile():保存修改后的 Excel 文件。四、按列拆分 Excel 工作表
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();
}
}worksheet.getColumns():获取源工作表的指定列。 worksheet.copyColumn():将获取到的列复制到新的工作表中。saveToFile() 保存修改后的 Excel 文件。五、结语