场景案例:
假如有一个学生信息管理系统,须要从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<Student> readExcel(String filePath) {
List<Student> students = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(new File(filePath))) {
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0); // 读取第一个sheet
Iterator<Row> 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<Map<String, Object>>
点击生成代码取得残缺的代码。
// 类名:ExcelDataReader
// 函数名:readExcelData
// 函数性能:读取Excel数据并返回List<Map<String, Object>>类型的后果
// POM依赖包:
// <dependency>
// <groupId>org.apache.poi</groupId>
// <artifactId>poi</artifactId>
// <version>4.1.2</version>
// </dependency>
// <dependency>
// <groupId>org.apache.poi</groupId>
// <artifactId>poi-ooxml</artifactId>
// <version>4.1.2</version>
// </dependency>
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<Map<String, Object>>后果
// 调用示例:
// File file = new File("data.xlsx");
// List<Map<String, Object>> 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<Map<String, Object>>的格局
FuncGPT(慧函数)就像一个线上的“名师”,能够在短时间内依据你的需要给到一个清晰易懂,可读性优良,绝对精准的“解决方案”,甚至是拿来即用的代码。而在特定的需要场景下,开发人员能够依据本人的理论需要在FuncGPT(慧函数)生成的代码根底上进行批改。
比方,因为EXCEL整体格局内容的话,会影响读取无效行或者无效列的实在数据,故须要对行和列进行相干无效校验。在原有代码的根底上,能够做以下一些批改:
1)首先判断列,因为列的实在长度会影响到行的读取;
2)读取第一行表头,如果遇到空白列,则认定无效列为上一个列的下标。
3)获取到无效列之后 去遍历每一行数数据,如果有整行为空则跳出循环,完结数据获取。
五、总结
通过以上代码和解释,咱们理解了如何应用Java和Apache POI库来读取Excel文件。这对于开发学生信息管理系统等利用十分重要。同时,对可能呈现的异样进行适当的解决也是开发过程中不可或缺的一部分。心愿这篇文章能帮忙你实现你的我的项目。
发表回复