SpringBoot解析Excel

现在很多web应用中,导入excel导出excel很常见,这篇文章就讲讲导入excel文件。

以批量导入课程为例

首先加入需要的jar包

        <!--解析excel-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>RELEASE</version>
		</dependency>

数据库中创建一个表course

DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `course_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '课程id',
  `course_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '课程代码',
  `course_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '课程名称',
  `teacher_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '教师id',
  `course_time` date NOT NULL DEFAULT '1996-01-01' COMMENT '开课时间',
  `class_room` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '开课地点',
  `course_week` int(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '课程学时',
  `course_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '必修课' COMMENT '课程类型',
  `college_id` int(11) UNSIGNED NOT NULL COMMENT '所属院系id',
  `score` int(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '学分',
  `is_on` tinyint(2) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否开启了选课,默认0未开启',
  PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '课程表' ROW_FORMAT = Dynamic;

新建一个ExcelUtil.java

/**
 * excel工具类
 */
public class ExcelUtils {

    private static Logger logger = LoggerFactory.getLogger(ExcelUtils.class);

    /**
     * 课程excel
     * @param in
     * @param fileName
     * @return
     * @throws Exception
     */
    public static List getCourseListByExcel(InputStream in, String fileName) throws Exception {

        List list = new ArrayList<>();

        // 创建excel工作簿
        Workbook work = getWorkbook(in, fileName);
        if (null == work) {
            throw new Exception("创建Excel工作薄为空!");
        }

        Sheet sheet = null;
        Row row = null;
        Cell cell = null;

        for (int i = 0; i < work.getNumberOfSheets(); i++) {

            sheet = work.getSheetAt(i);
            if(sheet == null) {
                continue;
            }

            // 滤过第一行标题
            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                if (row == null || row.getFirstCellNum() == j) {
                    continue;
                }

                List<Object> li = new ArrayList<>();

                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                    cell = row.getCell(y);
                    // 日期类型转换
                    if(y == 3) {
                        //cell.setCellType(CellType.STRING);
                        double s1 = cell.getNumericCellValue();
                        Date date = HSSFDateUtil.getJavaDate(s1);
                        li.add(date);
                        continue;
                    }

                    li.add(cell);
                }
                list.add(li);
            }
        }
        work.close();
        return list;
    }

    /**
     * 判断文件格式
     * @param in
     * @param fileName
     * @return
     */
    private static Workbook getWorkbook(InputStream in, String fileName) throws Exception {

        Workbook book = null;
        String filetype = fileName.substring(fileName.lastIndexOf("."));

        if(".xls".equals(filetype)) {
            book = new HSSFWorkbook(in);
        } else if (".xlsx".equals(filetype)) {
            book = new XSSFWorkbook(in);
        } else {
            throw new Exception("请上传excel文件!");
        }

        return book;
    }
}

这里主要注意一下上面的日期转换,在excel中的日期,通过Java读出来之后,变成了26 四月 2019这样的形式,而数据库中我们的字段类型为date,所以总是插入失败。

上面我的写法直接是知道那个字段是Date类型,所以直接使用y==3,这样写可复用性很差。

接下来直接看和数据库交互的逻辑代码

   /**
     * 通过excel文件,批量增加课程
     * @param request
     * @return
     * @throws Exception
     */
    @PostMapping("/upload/course")
    public String uploadCourseExcel(HttpServletRequest request) {


        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;

        MultipartFile file = multipartHttpServletRequest.getFile("courseFile");
        if(file.isEmpty()) {
            return "redirect:/admin/course/list";
        }

        try {
            InputStream inputStream = file.getInputStream();
            List<List<Object>> list = ExcelUtils.getCourseListByExcel(inputStream, file.getOriginalFilename());
            inputStream.close();

            for (int i = 0; i < list.size(); i++) {
                List<Object> courseList = list.get(i);

                Course course = new Course();

                course.setCourseCode(courseList.get(0).toString());
                course.setCourseName(courseList.get(1).toString());
                // 通过教师姓名查教师id
                String teacherId = teacherService.getTeacByName(courseList.get(2).toString());
                // 教师信息错误,直接跳过这条记录
                if(teacherId == null) {
                    continue;
                }
                course.setTeacherId(teacherId);

                // 格式化时间
                Date date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse(courseList.get(3).toString());
                course.setCourseTime(new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(date)));

                course.setClassRoom(courseList.get(4).toString());
                course.setCourseWeek(Integer.parseInt(new DecimalFormat("0").format(Double.parseDouble(courseList.get(5).toString()))));

                course.setCourseType(courseList.get(6).toString());
                // 通过院系名称查询院系id
                Integer collegeId = collegeService.getCollegeByName(courseList.get(7).toString());
                // 院系有误,直接跳过这条记录
                if(collegeId == null || collegeId == 0) {
                    continue;
                }
                course.setCollegeId(collegeId);
                course.setScore(Integer.parseInt(new DecimalFormat("0").format(Double.parseDouble(courseList.get(8).toString()))));
                // 默认不开启选课
                course.setIsOn(0);

                logger.error("course = " + course);

                // 判断课程是否重复(同一门课程可以有多个教师教师course_code, course_name, teacher_id联合)
                Integer courseId = null;
                courseId = courseService.getCourseByThree(course);

                // 存在重复的
                if(courseId != null) {
                    // 跳过不添加
                    continue;
                }

                // 执行插入操作
                courseService.addCourse(course);
            }
        } catch (Exception e) {
            return "redirect:/admin/course/list";
        }

        return "redirect:/admin/course/list";
    }

可以看到,我又对时间类型进行了处理,才能最终插入数据库

// 格式化时间
Date date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse(courseList.get(3).toString());
course.setCourseTime(new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(date)));

同时,在excel中的整数类型,取出来之后就会变成Double类型比如5变成5.0,所以我对此也进行了处理

course.setCourseWeek(Integer.parseInt(new DecimalFormat("0").format(Double.parseDouble(courseList.get(5).toString()))));

最后调用代码进行插入操作。

看看前端代码

<button class="btn btn-default col-md-2" style="margin-top: 20px">
    <a data-toggle="modal" href="#uploadExcel" role="button" style="color: black; text-decoration: none">
        批量添加<sapn class="glyphicon glyphicon-plus"/>
    </a>
</button>

<!--批量添加模态框-->
<div class="modal fade" tabindex="-1" role="dialog" id="uploadExcel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <form class="form-horizontal" role="form" th:action="@{/admin/upload/course}"
                      enctype="multipart/form-data" method="post">
                <div class="modal-body">
                    请选择文件:<input type="file" name="courseFile">
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="submit" class="btn btn-success">添加</button>
                </div>
            </form>
        </div>
    </div>
</div>

这里我通过button唤醒一个模态框来添加

最后测试结果
excel记录

数据库记录

关注微信公众号:秃头哥编程(ID:xp_1311664842),领取编程大礼包。
在这里插入图片描述

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 在SpringBoot上上传Excel文件和解析,需要使用POI库。您可以在控制器中定义一个处理multipart/form-data类型的POST请求的方法。使用MultipartFile对象接收上传的Excel文件,并使用POI库读取和解析该文件。然后您可以将解析的数据存储到数据库或将其返回到前端。 ### 回答2: Spring Boot是一个Java框架, 它能够帮助我们快速构建基于Spring的应用程序。当我们需要在Web应用程序中上传并解析Excel文件时,Spring Boot提供了一些默认的库和一些自定义组件,来实现该过程。以下是一个简单的步骤,演示如何使用Spring Boot上传Excel文件并解析它。 1. 配置pom.xml文件 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> ``` 这些依赖提供了Spring Boot和Apache POI(Java类库,用于处理Microsoft文件格式,如Excel、Word、PowerPoint等),以便我们能够在应用程序中上传和解析Excel文件。 2. 创建控制器类 我们需要在程序中创建一个控制器类,以便处理文件上传和解析请求。 在此示例中,我们可以使用以下代码创建控制器类: ``` @RestController @RequestMapping("/api") public class UploadExcelController { @PostMapping("/upload") public ResponseEntity<?> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException { // Read Excel file Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); // Process data for (Row row : sheet) { for (Cell cell : row) { System.out.print(cell.toString() + "\t"); } System.out.println(); } // Return success response return ResponseEntity.ok("File uploaded and data processed successfully!"); } } ``` 上述代码为我们创建了一个RestController,用于处理文件上传和解析请求。我们使用了 @RequestParam("file")来指定上传文件的参数名,然后使用MultipartFile类型的file参数来接收该文件。我们还使用了WorkbookFactory.create()方法,将文件输入流转换为Workbook对象以便我们可以解析它。 我们使用sheet.getSheetAt(0)方法获取第一个工作表,然后使用两个 for 循环遍历行和列,用于处理Excel数据。请注意,在实际应用中,您可以根据需要来进行更改以及添加必要的逻辑(例如,将解析Excel数据写入到数据库中等等)。 最后我们使用 ResponseEntity.ok() 方法向客户端发送成功响应。 3. 创建并运行应用程序 我们可以使用Spring Boot CLI在命令行中创建并运行Spring Boot应用程序。为了运行Spring Boot应用程序,请在命令行中输入以下命令: ``` spring run app.groovy ``` 这将启动应用程序。我们也可以使用集成的开发环境(IDE)来创建和运行应用程序。为此,请创建一个新的Spring Boot项目,将上述代码添加到控制器类中,并使用以下命令启动应用程序: ``` mvn spring-boot:run ``` 注意:此示例代码中的路径和方法名仅供参考。在实际应用中,您需要根据您的实际要求进行更改。 总结 Spring Boot提供了一些非常方便的方式,来实现上传和解析Excel文件的功能。我们可以使用Spring Boot集成了Apache POI库来处理Excel文件,从而使我们的代码更加简洁和易于维护。此外,使用Spring Boot,我们可以轻松地创建RESTful Web服务,通过这种方式来实现文件上传和解析。这让我们能够快速构建可以处理各种类型文件的web应用程序。 ### 回答3: Spring Boot提供了简单且强大的方式来上传Excel文件并解析Excel文件通常用于前端与后端之间的数据交互,如批量导入数据或导出报表。以下是如何使用Spring Boot上传Excel文件和解析的步骤: 1.添加依赖 添加以下依赖来处理Excel文件上传和解析: ``` <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> ``` 2.创建上传文件控制器 创建一个控制器来处理Excel文件上传。在Spring Boot中,可以使用`@PostMapping`来处理`multipart/form-data`的POST请求来上传文件。以下代码演示了如何处理上传的Excel文件: ``` @PostMapping("/upload") public ModelAndView uploadExcelFile(@RequestParam("file") MultipartFile file) { // Check if file is empty if (file.isEmpty()) { ModelAndView mav = new ModelAndView("uploadForm"); mav.addObject("message", "Please select a file to upload"); return mav; } try { // Load Excel file to workbook object XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream()); // Get sheet at index 0 XSSFSheet sheet = workbook.getSheetAt(0); // Iterate over rows for (Row row : sheet) { // Iterate over cells for (Cell cell : row) { // Print cell value System.out.print(cell.getStringCellValue() + "\t"); } System.out.println(""); } ModelAndView mav = new ModelAndView("uploadForm"); mav.addObject("message", "File uploaded successfully"); return mav; } catch (IOException e) { e.printStackTrace(); ModelAndView mav = new ModelAndView("uploadForm"); mav.addObject("message", "Error uploading file"); return mav; } } ``` 3.创建上传文件表单 创建一个包含文件上传控制器URL的HTML表单: ``` <form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 4.测试文件上传和解析 运行应用程序并访问表单页面,选择要上传的Excel文件并单击“上传”按钮,应该会看到控制台打印出Excel文件的内容,并且页面应显示上传成功消息。如果Excel文件格式不正确,则会显示错误消息。 总的来说,Spring Boot使Excel文件上传和解析变得非常简单。与其他Web框架相比,Spring Boot的优势在于它提供了开箱即用的依赖,使Excel文件上传和解析变得更加容易。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值