首页 > 其他分享 >使用multipartFile对象解析Execl

使用multipartFile对象解析Execl

时间:2024-09-08 23:24:11浏览次数:12  
标签:Execl 解析 STRING setCellType CellType getCell rowNum multipartFile row

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("导入成功");

   }

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;

   }

②解析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;

   }

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


xls使用HSSFWorkbook 对象进行解析


xlsx使用XSSWorkbook 对象进行解析


标签:Execl,解析,STRING,setCellType,CellType,getCell,rowNum,multipartFile,row
From: https://blog.51cto.com/u_16265692/11953419

相关文章

  • Redis 集群的实现方案全解析
    在当今大数据时代,Redis作为一款高性能的内存数据库,被广泛应用于各种场景。然而,随着数据量的不断增长和业务需求的日益复杂,单节点的Redis往往无法满足需求,这时就需要使用Redis集群来实现数据的分布式存储和高可用性。今天,我们就来一起探讨一下Redis集群的实现方案有哪些。一......
  • Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量
    Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的集合框架为开发者提供了多种数据结构,每种数据结构都有其特定的使用场景和性能特征。本文将深度解析Java中的主要集合类,从Array......
  • Transformer图解以及相关的概念解析
    前言transformer是目前NLP甚至是整个深度学习领域不能不提到的框架,同时大部分LLM也是使用其进行训练生成模型,所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面纱。transformer概述Transforme......
  • 深度解析卡尔曼滤波:原理、作用与应用
    目录一、卡尔曼滤波的基本概念二、卡尔曼滤波的数学原理三、卡尔曼滤波的作用四、卡尔曼滤波的应用五、扩展:扩展卡尔曼滤波和无迹卡尔曼滤波六、总结卡尔曼滤波(KalmanFilter)是一种用于动态系统状态估计的数学算法,尤其适用于存在噪声和不确定性的环境。其广泛应用于......
  • freeRTOS源码解析4--task.c 3
    4.2.6任务删除--vTaskDelete这个接口并不复杂,主要是在判断是否要放到xTasksWaitingTermination列表里,还是直接处理。1voidvTaskDelete(TaskHandle_txTaskToDelete)2{3TCB_t*pxTCB;4BaseType_txDeleteTCBInIdleTask=pdFALSE;5BaseTyp......
  • PostgreSQL分区功能深度解析及代码样例
    PostgreSQL分区功能深度解析及代码样例引言PostgreSQL(简称PG)是一款功能强大的开源关系型数据库管理系统,广泛应用于各种企业级应用中。随着数据量的不断增长,数据库的性能和可管理性成为开发者关注的焦点。PostgreSQL的分区功能正是为了解决这些问题而设计的,它允许将一个大表分割成......
  • Linux主流系统的优缺点深度解析
    Linux主流系统的优缺点深度解析Linux,作为开源和免费的操作系统,以其高度的稳定性、安全性、灵活性以及丰富的软件生态系统,在服务器、嵌入式系统和桌面计算等多个领域得到广泛应用。本文将深入探讨几种主流的Linux发行版——RedHat、CentOS、Ubuntu、Debian和Fedora,并详细分析它们的......
  • C++万字解析类和对象
     1.类的定义class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面......
  • 【Java】Word题库解析2
     初稿见:https://www.cnblogs.com/mindzone/p/18362194一、新增需求在原稿题库之后,还需要生成一份纯题目+ 纯答案答案放在开头,题目里面去掉答案在检查题型时还发现部分内容略有区别: 所以在判断是否为答案的时候需要兼容这种答案二、关于老版本支持doc2000版需要追加......
  • Go语言中的RPC协议原理解析
    Go语言中的RPC协议原理解析在分布式系统中,不同的服务或组件通常运行在不同的计算机或进程上。为了实现这些服务之间的通信,我们可以使用RPC(RemoteProcedureCall,远程过程调用)协议。RPC允许我们像调用本地函数一样调用远程服务,从而简化了分布式系统中的通信复杂性。本文将详......