Java如何使用multipartFile对象解析Execl

 更新时间:2025年02月11日 09:42:00   作者:唯有遗忘最漫长  
本文介绍了如何使用Spring的MultipartFile类解析Excel文件(.xls和.xlsx),包括文件上传、数据校验、输入流获取、文件解析、数据保存和异常处理的详细步骤

Java使用multipartFile对象解析Execl

1.需要使用 multipartFile 包

package org.springframework.web.multipart;

2.数据校验

public String exportVehicleViol(MultipartFile multipartFile) {
        try {
            //对前端传递的文件进行校验
            if (multipartFile == null && multipartFile.getSize() == 0) {
                return "文件上传错误,重新上传";
            }
            //获取文件名称 判断文件是否为 Execl
            String filename = multipartFile.getOriginalFilename();
            if (!(filename.endsWith(".xls") || filename.endsWith(".xlsx"))) {
                return "文件上传格式有误,请重新上传";
            }
            List<EhicleViolation> ehicleViolations = null;
            InputStream inputStream = multipartFile.getInputStream();
            //根据文件格式 对应不同的api解析
            if (filename.endsWith(".xlsx")) {
                ehicleViolations = readXlsx(inputStream);
            } else {
                ehicleViolations = readXls(inputStream);
            }
            //数据保存
            saveBatch(ehicleViolations);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JsonResult.Success("导入成功");
    }
  • MultipartFile:这个类是Spring提供的,用于处理文件上传。它代表了上传的文件。
  • 空文件检查:首先检查multipartFile是否为null,以及文件的大小是否为0。如果是,返回错误提示。
  • 文件类型校验:使用getOriginalFilename()获取上传文件的名称,然后检查其后缀是否为.xls.xlsx。如果不符合条件,返回格式错误的提示。
  • 输入流获取:调用multipartFile.getInputStream()获取文件的输入流,准备进行后续解析。
  • 文件解析:根据文件后缀名调用不同的解析方法:
    • 如果是.xlsx,调用readXlsx()方法。
    • 如果是.xls,调用readXls()方法。
  • 数据保存:解析完毕后,调用saveBatch()将解析的数据存储到数据库。
  • 异常处理:捕获IOException,并打印堆栈信息。可以考虑在这里加上日志记录或用户友好的错误信息。

3.主要解析的业务逻辑

①解析xls

//解析xls
    private List<EhicleViolation> readXls(InputStream inputStream) throws IOException {
        HSSFWorkbook sheets = new HSSFWorkbook(inputStream);

        //读取第一张sheet
        HSSFSheet sheetAt = sheets.getSheetAt(0);
        List<EhicleViolation> ehicleViolatsion = new ArrayList<>();
        //rowNum = 3 从第三行开始获取值
        for (int rowNum = 3; rowNum < sheetAt.getLastRowNum(); rowNum++) {
            EhicleViolation ehicleViolation = new EhicleViolation();
            HSSFRow row = sheetAt.getRow(rowNum);

            if (row != null) {
                //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
                //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                //然后poi会根据字符串读取它
                row.getCell(0).setCellType(CellType.STRING);
                row.getCell(1).setCellType(CellType.STRING);
                row.getCell(2).setCellType(CellType.STRING);
                row.getCell(3).setCellType(CellType.STRING);
                row.getCell(4).setCellType(CellType.STRING);
                row.getCell(5).setCellType(CellType.STRING);
                row.getCell(6).setCellType(CellType.STRING);
                row.getCell(7).setCellType(CellType.STRING);
                row.getCell(8).setCellType(CellType.STRING);
                
                String stringCellValue0 = row.getCell(0).getStringCellValue();
               
                String stringCellValue1 = row.getCell(1).getStringCellValue();
                if (StringUtils.isNotBlank(stringCellValue1)) {
                    ehicleViolation.setUserDept(stringCellValue1);
                }
                //根据自己需要 获取表格中的数据
                String stringCellValue2 = row.getCell(2).getStringCellValue();
                if (StringUtils.isNotBlank(stringCellValue2)) {
                    ehicleViolation.setVehicleNumber(stringCellValue2);
                } else {
                    continue;
                }
                
            }
            EehicleViolations.add(EehicleViolation);
        }
        return EehicleViolations;
    }
  • HSSFWorkbook:用于解析.xls格式的Excel文件。通过传入InputStream创建工作簿对象。
  • 获取工作表:使用getSheetAt(0)方法获取第一个工作表。
  • 创建列表:初始化一个ArrayList<EhicleViolation>用于存放解析后的数据。
  • 读取行数据:使用for循环从第三行开始读取数据(假设前两行是标题或无关信息),直到最后一行:
    • 获取行对象:通过sheetAt.getRow(rowNum)获取当前行。
    • 行非空检查:确认行对象不为空。
    • 设置单元格类型:循环设置每个单元格的类型为字符串,以避免因数据类型不同而引发的异常(例如:尝试读取数值单元格为字符串)。
  • 获取单元格值
    • 读取第2列(索引1)的值并调用setUserDept方法设置部门信息。
    • 读取第3列(索引2)的值并调用setVehicleNumber方法设置车辆编号。如果车辆编号为空,则跳过当前行,继续处理下一行。
  • 数据存储:将解析的EhicleViolation对象添加到ehicleViolations列表中。
  • 返回数据:最后返回包含所有解析数据的列表。

②解析xlsx

//解析xlsx
    private List<VmsVehicleViolation> readXlsx(InputStream inputStream) throws IOException {
        XSSFWorkbook sheets1 = new XSSFWorkbook(inputStream);

        XSSFSheet sheetAt1 = sheets1.getSheetAt(0);

        List<EhicleViolation> ehicleViolatsion = new ArrayList<>();
        //rowNum = 3 从第三行开始获取值
        for (int rowNum = 3; rowNum < sheetAt.getLastRowNum(); rowNum++) {
            EhicleViolation ehicleViolation = new EhicleViolation();
            HSSFRow row = sheetAt.getRow(rowNum);

            if (row != null) {
                //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
                //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                //然后poi会根据字符串读取它
                row.getCell(0).setCellType(CellType.STRING);
                row.getCell(1).setCellType(CellType.STRING);
                row.getCell(2).setCellType(CellType.STRING);
                row.getCell(3).setCellType(CellType.STRING);
                row.getCell(4).setCellType(CellType.STRING);
                row.getCell(5).setCellType(CellType.STRING);
                row.getCell(6).setCellType(CellType.STRING);
                row.getCell(7).setCellType(CellType.STRING);
                row.getCell(8).setCellType(CellType.STRING);
                
                String stringCellValue0 = row.getCell(0).getStringCellValue();
               
                String stringCellValue1 = row.getCell(1).getStringCellValue();
                if (StringUtils.isNotBlank(stringCellValue1)) {
                    ehicleViolation.setUserDept(stringCellValue1);
                }
                //根据自己需要 获取表格中的数据
                String stringCellValue2 = row.getCell(2).getStringCellValue();
                if (StringUtils.isNotBlank(stringCellValue2)) {
                    ehicleViolation.setVehicleNumber(stringCellValue2);
                } else {
                    continue;
                }
                
            }
            EehicleViolations.add(EehicleViolation);
        }
        return EehicleViolations;
    }
  • XSSFWorkbook:用于解析.xlsx格式的Excel文件。与HSSFWorkbook类似,只是处理的新格式。
  • 获取工作表:同样使用getSheetAt(0)获取第一个工作表。
  • 列表初始化:创建一个新的ArrayList<EhicleViolation>用于存放解析的数据。
  • 读取行数据:与readXls方法相同的逻辑,循环遍历从第三行开始到最后一行的所有行,读取数据。
  • 设置单元格类型和获取值:使用相同的方式设置单元格类型并读取所需的列。
  • 数据存储:添加解析后的对象到列表并返回。

注意:对于不同的Execl Java提供了不同的解析对象

  • xls使用HSSFWorkbook 对象进行解析
  • xlsx使用XSSWorkbook 对象进行解析

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于logback.xml不生效问题的解决

    基于logback.xml不生效问题的解决

    这篇文章主要介绍了基于logback.xml不生效问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 关于@Component注解下的类无法@Autowired问题

    关于@Component注解下的类无法@Autowired问题

    这篇文章主要介绍了关于@Component注解下的类无法@Autowired问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MyBatis框架简介及入门案例详解

    MyBatis框架简介及入门案例详解

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码,本文将作为最终篇为大家介绍MyBatis的使用
    2022-08-08
  • 关于springboot中nacos动态路由的配置

    关于springboot中nacos动态路由的配置

    这篇文章主要介绍了springboot中nacos动态路由的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java 中如何使用 JavaFx 库标注文本颜色

    Java 中如何使用 JavaFx 库标注文本颜色

    这篇文章主要介绍了在 Java 中用 JavaFx 库标注文本颜色,在本文中,我们将了解如何更改标签的文本颜色,并且我们还将看到一个必要的示例和适当的解释,以便更容易理解该主题,需要的朋友可以参考下
    2023-05-05
  • Java设计模式之桥接模式的实现

    Java设计模式之桥接模式的实现

    今天给大家带来的文章是Java设计模式的相关知识点,文中对桥接模式作了非常详细的介绍及代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • java中Map和List初始化的N种方法总结

    java中Map和List初始化的N种方法总结

    这篇文章主要介绍了java中Map和List初始化的N种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Boot Mail QQ企业邮箱无法连接解决方案

    Spring Boot Mail QQ企业邮箱无法连接解决方案

    这篇文章主要介绍了Spring Boot Mail QQ企业邮箱无法连接解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot使用maven实现多环境运行和打包的操作步骤

    SpringBoot使用maven实现多环境运行和打包的操作步骤

    在开发过程中,需要不断进行环境的切换和打包部署,maven提供了多环境配置,可以方便实现不同环境的配置切换和打包,本文通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • java中staticclass静态类详解

    java中staticclass静态类详解

    这篇文章主要介绍了java中staticclass静态类详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12

最新评论