Javaweb 通过上传Excel 批量导入学生信息
Javaweb的图书管理系统中,通常需要实现批量导入学生列表的功能,以简化学生信息的录入过程。下面使用Javaweb技术和easyPOI库实现功能。
数据库表结构
首先,我们需要在数据库中创建一个用于存储学生信息的表格。我们假设创建了一个名为student
的表格,包含以下字段:
- id:学生ID,自增长主键
- name:学生姓名
- sex:学生性别
- grade:学生年级
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
sex VARCHAR(10),
grade INT
);
实体类Student
我们需要创建一个Java实体类来表示学生信息。创建一个名为Student
的类,包含与数据库表格字段对应的属性,并提供相应的getter和setter方法。
@Data
public class Student {
private int id;
private String name;
private String sex;
private int grade;
// getter和setter方法省略...
}
数据库操作接口和映射文件
接下来,我们需要创建一个数据库操作接口StudentMapper
和对应的映射文件StudentMapper.xml
,用于执行数据库操作。
public interface StudentMapper {
int addStudents(List<Student> students);
// 其他数据库操作方法...
}
<!-- StudentMapper.xml -->
<mapper namespace="com.book.dao.StudentMapper">
<insert id="addStudents">
INSERT INTO student (name, sex, grade)
VALUES
<foreach collection="students" item="item" separator=",">
(#{item.name}, #{item.sex}, #{item.grade})
</foreach>
</insert>
<!-- 其他数据库操作语句... -->
</mapper>
或者在studentMapper中使用注解
@Insert("<script>" +
"insert into student(name,sex,grade) values " +
"<foreach collection='students' item='item' separator=','>" +
"(#{item.name},#{item.sex},#{item.grade})" +
"</foreach>" +
"</script>")
int addStudents(@Param("students") List<Student> students);
实现Servlet
创建一个名为UploadStudentsList
的Servlet类,用于处理批量导入学生列表的请求。读取上传的Excel文件,并将学生信息存储到数据库中。
@MultipartConfig //注意加入注解,支持文件上传
@WebServlet("/add-students")
public class UploadStudentsList extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
System.out.println("进入上传学生列表servlet");
Part filePart = req.getPart("file");//获取上传的文件
String fileName = filePart.getSubmittedFileName();//获取上传的文件名
int j = 0;
try {
// 保存上传的文件到服务器的临时位置
File tempFile = File.createTempFile(fileName, "file");
filePart.write(tempFile.getAbsolutePath());
// 根据临时文件的绝对路径,创建一个FileInputStream对象
FileInputStream in = new FileInputStream(tempFile);
// 使用WorkbookFactory类的create方法,根据FileInputStream对象创建一个Workbook对象
Workbook workbook = WorkbookFactory.create(in);
List<Student> students = new ArrayList<>();
// 获取Workbook对象中的第一个Sheet
Sheet sheet = workbook.getSheetAt(0);
// 遍历Sheet中的Row,从第二行开始,跳过表头
for (j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {
Row row = sheet.getRow(j);
// 获取每个单元格的数据,并封装成一个Student对象
Student student = new Student();
student.setName(row.getCell(0).getStringCellValue());
student.setSex(row.getCell(1).getStringCellValue());
student.setGrade((int) row.getCell(2).getNumericCellValue());
// 将Student对象添加到List集合中
students.add(student);
}
System.out.println(students);
try (SqlSession sqlSession = MyBatisUtil.getSession()) {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
if (studentMapper.addStudents(students) > 0) {
resp.sendRedirect("students");
resp.getWriter().write("导入成功");
}
}
} catch (Exception e) {
e.printStackTrace();
// req.setAttribute("errorMessage", "导入失败,请检查文件格式或内容。");
resp.getWriter().write(j + "::导入失败,请检查文件格式或内容");
}
}
}
创建上传表单页面
最后,我们需要创建一个上传表单页面,让用户选择要导入的Excel文件。用户可以在页面中选择文件并提交表单。
<form action="add-students" method="post" enctype="multipart/form-data">
<label for="fileInput" class="btn btn-secondary mb-
2" data-bs-toggle="modal" style="display: inline-block; margin-left: 20px;">
选择文件上传
<input id="fileInput" name="file" type="file" style="display: none;" accept=".xls,.xlsx">
</label>
<button type="submit" class="btn btn-primary">提交</button>
</form>
可能需要的依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
- 表单需要加入 enctype=“multipart/form-data” 使表单支持文件传输
- Servlet中加入 @MultipartConfig 注解