Javaweb 通过上传Excel 批量导入信息

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 注解

效果

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值