Java实现学生信息管理系统读取Excel数据

简介: 场景案例:假设有一个学生信息管理系统,需要从Excel文件中读取学生的姓名、年龄、成绩等数据,并将这些数据存储到系统中进行进一步的处理和管理。

场景案例:
假设有一个学生信息管理系统,需要从Excel文件中读取学生的姓名、年龄、成绩等数据,并将这些数据存储到系统中进行进一步的处理和管理。

具体来说,在数据导入/导出系统中调用这个函数,并传入Excel文件作为参数,就可以得到包含学生信息的结果。然后,可以对这个结果进行进一步的处理,比如将学生数据存储到数据库中或进行其他业务逻辑操作。

在Java开发的学生信息管理系统中,读取Excel数据是一个常见的需求。Excel文件常常被用作学生信息的输入源,因此,了解如何使用Java读取Excel数据对于开发人员来说是一项必备技能。本文将详细介绍如何使用Java读取Excel文件,并对异常情况做出处理。

一、环境准备

在开始之前,请确保你已经安装了Java开发环境,并了解基本的Java语法。为了处理Excel文件,我们将使用Apache POI库,它是一个流行的Java库,专门用于处理Microsoft Office文件。如果你还没有安装Apache POI,你可以通过Maven或Gradle将其添加到你的项目中。

二、代码实现

首先,我们需要导入必要的库。在Java中,这通常是通过import语句完成的。然后,我们将创建一个类并定义一个方法来读取Excel文件。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

接下来,我们定义一个名为readExcel的方法,该方法接受一个文件路径作为参数,并返回一个包含所有学生信息的列表。

public List readExcel(String filePath) {
List students = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(new File(filePath))) {
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0); // 读取第一个sheet
Iterator rowIterator = sheet.iterator(); // 创建一个行迭代器
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Cell cell = row.getCell(0); // 获取第一列的单元格
String studentName = cell.getStringCellValue();
students.add(new Student(studentName));
}
} catch (IOException e) {
e.printStackTrace();
}
return students;
}
这个方法首先打开指定的Excel文件,然后读取第一个sheet中的每一行。对于每一行,它获取第一列的单元格,并从中获取学生名。然后,它将这个学生名添加到学生列表中。如果在读取文件或处理数据时发生错误,它将打印错误堆栈跟踪。

三、异常处理

在处理文件和数据时,可能会发生多种错误。例如,文件可能不存在,或者文件可能不是Excel文件。此外,单元格可能不包含我们期望的数据。为了处理这些情况,你应该添加更多的错误检查和处理代码。例如:

1、 检查文件是否存在:在打开文件之前,可以检查文件是否存在。如果文件不存在,你可以抛出一个异常或返回一个错误消息。

2、 检查文件是否是Excel文件:在打开文件之前,可以尝试读取文件的几个字节,并检查它们是否是Excel文件的签名(例如,"Poi"对于POI库)。如果不是,你可以抛出一个异常或返回一个错误消息。

3、 检查单元格的数据类型:如果单元格不包含字符串,那么getStringCellValue方法将抛出一个RuntimeException。你可以使用getCellType方法检查单元格的数据类型,并根据需要处理数据。

4、处理空行:如果sheet中有一行是空的,那么rowIterator.hasNext()将返回false,导致我们停止处理数据。你可以添加一个检查来确保每一行都包含数据。

四、FuncGPT(慧函数)实操

不同的定制化的数据处理需求场景可能有细微的细节差异,按照以上教程从头开始写又太繁琐,这时候开发人员可以想好大致的需求,通过询问FuncGPT(慧函数),依然可以通过使用Apache POI库快速实现Excel文件的读取。

输入需求:
读取EXCEL数据,入参: File file,出参:List>

点击生成代码获得完整的代码。

// 类名:ExcelDataReader
// 函数名:readExcelData
// 函数功能:读取Excel数据并返回List>类型的结果
// POM依赖包:
//
// org.apache.poi
// poi
// 4.1.2
//
//
// org.apache.poi
// poi-ooxml
// 4.1.2
//

import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelDataReader {
/**

 * 读取Excel数据并返回List<Map<String, Object>>类型的结果
 * @param file Excel文件
 * @return Excel数据的List<Map<String, Object>>结果
 * @throws IOException 当读取Excel文件出现错误时抛出IOException
 */
public static List<Map<String, Object>> readExcelData(File file) throws IOException {
    List<Map<String, Object>> dataList = new ArrayList<>(); // 创建存储Excel数据的List

    FileInputStream fis = new FileInputStream(file); // 创建文件输入流
    Workbook workbook = WorkbookFactory.create(fis); // 创建Workbook对象

    Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
    int rowCount = sheet.getLastRowNum(); // 获取行数

    Row headerRow = sheet.getRow(0); // 获取标题行
    int columnCount = headerRow.getLastCellNum(); // 获取列数

    for (int i = 1; i <= rowCount; i++) { // 遍历每一行(跳过标题行)
        Row row = sheet.getRow(i);
        Map<String, Object> rowData = new HashMap<>();

        for (int j = 0; j < columnCount; j++) { // 遍历每一列
            Cell cell = row.getCell(j);
            String columnName = headerRow.getCell(j).getStringCellValue(); // 获取列名

            Object cellValue;
            switch (cell.getCellType()) { // 根据单元格类型获取单元格值
                case STRING:
                    cellValue = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    cellValue = cell.getNumericCellValue();
                    break;
                case BOOLEAN:
                    cellValue = cell.getBooleanCellValue();
                    break;
                case FORMULA:
                    cellValue = cell.getCellFormula();
                    break;
                default:
                    cellValue = null;
            }

            rowData.put(columnName, cellValue); // 将列名和单元格值存入rowData
        }

        dataList.add(rowData); // 将rowData存入dataList
    }

    workbook.close(); // 关闭Workbook对象
    fis.close(); // 关闭文件输入流

    return dataList; // 返回Excel数据的结果
}

}

// 函数示例
// 读取Excel数据示例
// 入参:file,Excel文件
// 出参:dataList,Excel数据的List>结果
// 调用示例:
// File file = new File("data.xlsx");
// List> dataList = ExcelDataReader.readExcelData(file);
// System.out.println(dataList);
// 输出结果:例如,Excel数据为:
// | Name | Age | Grade |
// |-------|-----|-------|
// | Alice | 18 | A |
// | Bob | 20 | B |
// 则输出结果为:[{Name=Alice, Age=18, Grade=A}, {Name=Bob, Age=20, Grade=B}]
// 表示Excel数据被封装为List>的格式

FuncGPT(慧函数)就像一个线上的“名师”,可以在短时间内根据你的需求给到一个清晰易懂,可读性优秀,相对精准的“解决方案”,甚至是拿来即用的代码。而在特定的需求场景下,开发人员可以根据自己的实际需求在FuncGPT(慧函数)生成的代码基础上进行修改。

比如,由于EXCEL整体格式内容的话,会影响读取有效行或者有效列的真实数据,故需要对行和列进行相关有效校验。在原有代码的基础上,可以做以下一些修改:

1)首先判断列,因为列的真实长度会影响到行的读取;

2)读取第一行表头,如果遇到空白列,则认定有效列为上一个列的下标。

3)获取到有效列之后 去遍历每一行数数据,如果有整行为空则跳出循环,结束数据获取。

五、总结

通过以上代码和解释,我们了解了如何使用Java和Apache POI库来读取Excel文件。这对于开发学生信息管理系统等应用非常重要。同时,对可能出现的异常进行适当的处理也是开发过程中不可或缺的一部分。希望这篇文章能帮助你实现你的项目。

相关文章
|
4天前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
18 4
|
1天前
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
15 0
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
7天前
|
监控 Java
Java文件夹复制解决方案:优化大文件与大量数据的处理
Java中复制文件夹及其内容,尤其是当处理大文件或文件夹(如几个GB)时,需要特别注意内存使用和性能优化。以下是一个详细的指导,包括如何避免内存溢出异常,并确保复制过程的高效性。
15 1
|
8天前
|
数据可视化 Python
我是如何把python获取到的数据写入Excel的?
我是如何把python获取到的数据写入Excel的?
22 2
|
10天前
|
消息中间件 负载均衡 Java
"Kafka核心机制揭秘:深入探索Producer的高效数据发布策略与Java实战应用"
【8月更文挑战第10天】Apache Kafka作为顶级分布式流处理平台,其Producer组件是数据高效发布的引擎。Producer遵循高吞吐、低延迟等设计原则,采用分批发送、异步处理及数据压缩等技术提升性能。它支持按消息键值分区,确保数据有序并实现负载均衡;提供多种确认机制保证可靠性;具备失败重试功能确保消息最终送达。Java示例展示了基本配置与消息发送流程,体现了Producer的强大与灵活性。
29 3
|
16天前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
27 7
|
20天前
|
监控 前端开发 JavaScript
|
5天前
|
数据管理 数据处理 数据库
分享一个导出数据到 Excel 的解决方案
分享一个导出数据到 Excel 的解决方案
|
5天前
|
前端开发 Java
如何实现 Java SpringBoot 自动验证入参数据的有效性
如何实现 Java SpringBoot 自动验证入参数据的有效性
14 0
|
5天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决