欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java如何使用multipartFile对象解析Execl,

来源: javaer 分享于  点击 12417 次 点评:53

Java如何使用multipartFile对象解析Execl,


目录
  • Java使用multipartFile对象解析Execl
    • 1.需要使用 multipartFile 包
    • 2.数据校验
    • 3.主要解析的业务逻辑
      • ①解析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 对象进行解析

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持3672js教程。

    您可能感兴趣的文章:
    • java后台本地文件转为MultipartFile类型的实现方式
    • Java中的MultipartFile接口和File类解读
    • java中File与MultipartFile互转代码示例
    • java MultipartFile文件上传重命名详细代码示例
    • java中MultipartFile类型转为File类型的4种方法
    • java文件/图片的上传与下载以及MultipartFile详解
    相关栏目:

    用户点评