Java如何使用multipartFile對象解析Execl
更新時間:2025年02月11日 09:42:00 作者:唯有遺忘最漫長
本文介紹了如何使用Spring的MultipartFile類解析Excel文件(.xls和.xlsx),包括文件上傳、數(shù)據(jù)校驗、輸入流獲取、文件解析、數(shù)據(jù)保存和異常處理的詳細步驟
Java使用multipartFile對象解析Execl
1.需要使用 multipartFile 包
package org.springframework.web.multipart;
2.數(shù)據(jù)校驗
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();
//根據(jù)文件格式 對應不同的api解析
if (filename.endsWith(".xlsx")) {
ehicleViolations = readXlsx(inputStream);
} else {
ehicleViolations = readXls(inputStream);
}
//數(shù)據(jù)保存
saveBatch(ehicleViolations);
} catch (IOException e) {
e.printStackTrace();
}
return JsonResult.Success("導入成功");
}- MultipartFile:這個類是Spring提供的,用于處理文件上傳。它代表了上傳的文件。
- 空文件檢查:首先檢查
multipartFile是否為null,以及文件的大小是否為0。如果是,返回錯誤提示。 - 文件類型校驗:使用
getOriginalFilename()獲取上傳文件的名稱,然后檢查其后綴是否為.xls或.xlsx。如果不符合條件,返回格式錯誤的提示。 - 輸入流獲取:調用
multipartFile.getInputStream()獲取文件的輸入流,準備進行后續(xù)解析。 - 文件解析:根據(jù)文件后綴名調用不同的解析方法:
- 如果是
.xlsx,調用readXlsx()方法。 - 如果是
.xls,調用readXls()方法。
- 如果是
- 數(shù)據(jù)保存:解析完畢后,調用
saveBatch()將解析的數(shù)據(jù)存儲到數(shù)據(jù)庫。 - 異常處理:捕獲
IOException,并打印堆棧信息??梢钥紤]在這里加上日志記錄或用戶友好的錯誤信息。
3.主要解析的業(yè)務邏輯
①解析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會根據(jù)字符串讀取它
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);
}
//根據(jù)自己需要 獲取表格中的數(shù)據(jù)
String stringCellValue2 = row.getCell(2).getStringCellValue();
if (StringUtils.isNotBlank(stringCellValue2)) {
ehicleViolation.setVehicleNumber(stringCellValue2);
} else {
continue;
}
}
EehicleViolations.add(EehicleViolation);
}
return EehicleViolations;
}- HSSFWorkbook:用于解析
.xls格式的Excel文件。通過傳入InputStream創(chuàng)建工作簿對象。 - 獲取工作表:使用
getSheetAt(0)方法獲取第一個工作表。 - 創(chuàng)建列表:初始化一個
ArrayList<EhicleViolation>用于存放解析后的數(shù)據(jù)。 - 讀取行數(shù)據(jù):使用
for循環(huán)從第三行開始讀取數(shù)據(jù)(假設前兩行是標題或無關信息),直到最后一行:- 獲取行對象:通過
sheetAt.getRow(rowNum)獲取當前行。 - 行非空檢查:確認行對象不為空。
- 設置單元格類型:循環(huán)設置每個單元格的類型為字符串,以避免因數(shù)據(jù)類型不同而引發(fā)的異常(例如:嘗試讀取數(shù)值單元格為字符串)。
- 獲取行對象:通過
- 獲取單元格值:
- 讀取第2列(索引1)的值并調用
setUserDept方法設置部門信息。 - 讀取第3列(索引2)的值并調用
setVehicleNumber方法設置車輛編號。如果車輛編號為空,則跳過當前行,繼續(xù)處理下一行。
- 讀取第2列(索引1)的值并調用
- 數(shù)據(jù)存儲:將解析的
EhicleViolation對象添加到ehicleViolations列表中。 - 返回數(shù)據(jù):最后返回包含所有解析數(shù)據(jù)的列表。
②解析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會根據(jù)字符串讀取它
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);
}
//根據(jù)自己需要 獲取表格中的數(shù)據(jù)
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)獲取第一個工作表。 - 列表初始化:創(chuàng)建一個新的
ArrayList<EhicleViolation>用于存放解析的數(shù)據(jù)。 - 讀取行數(shù)據(jù):與
readXls方法相同的邏輯,循環(huán)遍歷從第三行開始到最后一行的所有行,讀取數(shù)據(jù)。 - 設置單元格類型和獲取值:使用相同的方式設置單元格類型并讀取所需的列。
- 數(shù)據(jù)存儲:添加解析后的對象到列表并返回。
注意:對于不同的Execl Java提供了不同的解析對象
- xls使用HSSFWorkbook 對象進行解析
- xlsx使用XSSWorkbook 對象進行解析
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于@Component注解下的類無法@Autowired問題
這篇文章主要介紹了關于@Component注解下的類無法@Autowired問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
關于springboot中nacos動態(tài)路由的配置
這篇文章主要介紹了springboot中nacos動態(tài)路由的配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案
這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
SpringBoot使用maven實現(xiàn)多環(huán)境運行和打包的操作步驟
在開發(fā)過程中,需要不斷進行環(huán)境的切換和打包部署,maven提供了多環(huán)境配置,可以方便實現(xiàn)不同環(huán)境的配置切換和打包,本文通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2024-04-04

