Java如何使用multipartFile对象解析Execl,
分享于 点击 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
方法设置车辆编号。如果车辆编号为空,则跳过当前行,继续处理下一行。
- 读取第2列(索引1)的值并调用
- 数据存储:将解析的
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详解
用户点评