Java使用multipartFile对象解析Execl
1.需要使用 multipartFile 包
package org.springframework.web.multipart;
2.数据校验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 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
1 2 3 4 5 6 7 8 9 | //解析xls private List readXls(InputStream inputStream) throws IOException { HSSFWorkbook sheets = new HSSFWorkbook(inputStream); //读取第一张sheet HSSFSheet sheetAt = sheets.getSheetAt( 0 ); List ehicleViolatsion = new ArrayList(); //rowNum = 3 从第三行开始获取值 for ( int rowNum = 3 ; rowNum |
-
HSSFWorkbook:用于解析
.xls
格式的Excel文件。通过传入InputStream
创建工作簿对象。 -
获取工作表:使用
getSheetAt(0)
方法获取第一个工作表。 -
创建列表:初始化一个
ArrayList
用于存放解析后的数据。 -
读取行数据:使用
for
循环从第三行开始读取数据(假设前两行是标题或无关信息),直到最后一行:-
获取行对象:通过
sheetAt.getRow(rowNum)
获取当前行。 - 行非空检查:确认行对象不为空。
- 设置单元格类型:循环设置每个单元格的类型为字符串,以避免因数据类型不同而引发的异常(例如:尝试读取数值单元格为字符串)。
-
获取行对象:通过
-
获取单元格值:
- 读取第2列(索引1)的值并调用
setUserDept
方法设置部门信息。 - 读取第3列(索引2)的值并调用
setVehicleNumber
方法设置车辆编号。如果车辆编号为空,则跳过当前行,继续处理下一行。
- 读取第2列(索引1)的值并调用
-
数据存储:将解析的
EhicleViolation
对象添加到ehicleViolations
列表中。 - 返回数据:最后返回包含所有解析数据的列表。
②解析xlsx
1 2 3 4 5 6 7 8 9 | //解析xlsx private List readXlsx(InputStream inputStream) throws IOException { XSSFWorkbook sheets1 = new XSSFWorkbook(inputStream); XSSFSheet sheetAt1 = sheets1.getSheetAt( 0 ); List ehicleViolatsion = new ArrayList(); //rowNum = 3 从第三行开始获取值 for ( int rowNum = 3 ; rowNum |
-
XSSFWorkbook:用于解析
.xlsx
格式的Excel文件。与HSSFWorkbook
类似,只是处理的新格式。 -
获取工作表:同样使用
getSheetAt(0)
获取第一个工作表。 -
列表初始化:创建一个新的
ArrayList
用于存放解析的数据。 -
读取行数据:与
readXls
方法相同的逻辑,循环遍历从第三行开始到最后一行的所有行,读取数据。 - 设置单元格类型和获取值:使用相同的方式设置单元格类型并读取所需的列。
- 数据存储:添加解析后的对象到列表并返回。
注意:对于不同的Execl Java提供了不同的解析对象
- xls使用HSSFWorkbook 对象进行解析
- xlsx使用XSSWorkbook 对象进行解析
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。