使用 Java 拆分 Excel:Spire.XLS for Java 实战教程

在日常数据处理中,Excel 文件承载着海量信息。然而,面对包含多工作表、超长行数或需要按特定列进行分类的巨型 Excel 文件时,手动拆分无疑是一场噩梦,效率低下且容易出错。作为开发者,我们追求自动化和效率。本文将深入探讨如何利用 Java 强大的编程能力,结合 Spire.XLS for Java 库,高效、精准地完成 Excel 文件的拆分任务,让数据处理变得轻而易举。无论您是需要将一个 Excel 文件按工作表拆分为多个独立文件,还是需要将一个工作表按行或按列拆分成更小的单元,本教程都将为您提供清晰、可操作的解决方案。

一、Spire.XLS for Java 简介与环境配置

Spire.XLS for Java 是一个功能全面、高性能的 Java Excel API,允许开发者在 Java 应用程序中创建、读取、编辑、转换和打印 Excel 文件。它支持多种 Excel 格式(XLS、XLSX、CSV、ODS 等),提供了丰富的特性,包括但不限于单元格操作、样式设置、图表、数据透视表、公式计算等。对于 Excel 拆分这种常见的自动化需求,Spire.XLS for Java 提供了直观且强大的 API 接口。

1. 安装依赖

要在您的 Java 项目中使用 Spire.XLS for Java,最便捷的方式是通过 Maven 添加其依赖。

Maven:

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>

将上述配置添加到您的 pom.xml 文件中,然后重新加载项目依赖即可。

二、按工作表拆分 Excel 文件

最常见的拆分需求是将一个包含多个工作表的 Excel 文件,拆分成多个独立的 Excel 文件,每个文件只包含原文件中的一个工作表。

java 复制代码
    
    
    
  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);  
        }  
    }  
}

关键代码解析:

  1. workbook.loadFromFile("input.xlsx"):加载待处理的 Excel 文件。
  2. workbook.getWorksheets().getCount():获取工作表的总数。
  3. workbook.getWorksheets().get(i):获取指定索引的工作表。
  4. newWb.getWorksheets().addCopy():将原始工作表复制到新创建的 Workbook 对象中。
  5. newWorkbook.saveToFile(outputFileName):将包含单个工作表的新工作簿保存为独立文件。

三、按行拆分 Excel 工作表

当单个工作表数据量过大时,我们可能需要将其按行数或特定条件拆分成多个工作表或新的 Excel 文件。这里演示按固定行数拆分。

java 复制代码
    
    
    
  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));  
        }  
    }  
}

关键代码解析:

  1. sheet.getRows():获取源工作表的指定行。
  2. sheet.copyRow():将刚才获取到的行复制到新的工作表中。
  3. 循环遍历源工作表,每次复制 rowsPerSheet 行的数据(包括标题行)到一个新的工作簿中。
  4. saveToFile():保存修改后的 Excel 文件。

四、按列拆分 Excel 工作表

除了按行拆分,有时我们还需要将一个工作表按列拆分成多个文件,例如将原始数据按某些关键列进行分组。这里演示按固定列数拆分。

java 复制代码
    
    
    
  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();  
    }  
}

关键代码解析:

  1. worksheet.getColumns():获取源工作表的指定列。
  2. worksheet.copyColumn():将获取到的列复制到新的工作表中。
  3. saveToFile() 保存修改后的 Excel 文件。

五、结语

通过本文的详细教程,我们深入了解了如何利用 Spire.XLS for Java 库在 Java 应用程序中高效地拆分 Excel 文件。无论是按工作表、按行还是按列进行拆分,Spire.XLS for Java 都提供了简洁而强大的 API,极大地简化了复杂的 Excel 处理任务。它的高性能和丰富功能使其成为 Java 开发者处理 Excel 文件的理想选择。希望这些示例代码能帮助您在实际项目中实现 Excel 自动化处理,提升工作效率。鼓励大家尝试探索 Spire.XLS for Java 的更多功能,发现它在数据处理领域的无限潜力!

相关推荐
一隅论数智17 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
上海广测检测科技有限公司17 小时前
智能平板出口巴西合规详解:Anatel射频、Inmetro电源/电池与LGPD数据合规叠加
经验分享
FLJwu19 小时前
存储与固件量产实战01:运动相机TF卡量产翻车实录!V30≠4K可用,90%OEM踩中的隐形售后坑
经验分享·数码相机·相机
xiaomu0012320 小时前
床垫选型的技术评估模型:结构、材料、卫生与检测四层口径
经验分享
汉风设计装饰20 小时前
智慧办公弱电系统设计:门禁、监控与 IoT 传感器的集成方案
经验分享
m0_7196408721 小时前
支持开源二次开发的VR遥操机器人2026年选型推荐
经验分享
陈卫军老师21 小时前
陈卫军:把口味写在一张纸上,店才稳得住
经验分享·笔记·流量运营
从零开始的嵌入式之旅1 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员1 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程
欣悦财务1 天前
怎么判断代理记账收费值不值,把费用折成服务密度再比
经验分享