Java如何使用multipartFile對(duì)象解析Execl
Java使用multipartFile對(duì)象解析Execl
1.需要使用 multipartFile 包
package org.springframework.web.multipart;
2.數(shù)據(jù)校驗(yàn)
public String exportVehicleViol(MultipartFile multipartFile) { try { //對(duì)前端傳遞的文件進(jìn)行校驗(yàn) if (multipartFile == null && multipartFile.getSize() == 0) { return "文件上傳錯(cuò)誤,重新上傳"; } //獲取文件名稱 判斷文件是否為 Execl String filename = multipartFile.getOriginalFilename(); if (!(filename.endsWith(".xls") || filename.endsWith(".xlsx"))) { return "文件上傳格式有誤,請(qǐng)重新上傳"; } List<EhicleViolation> ehicleViolations = null; InputStream inputStream = multipartFile.getInputStream(); //根據(jù)文件格式 對(duì)應(yīng)不同的api解析 if (filename.endsWith(".xlsx")) { ehicleViolations = readXlsx(inputStream); } else { ehicleViolations = readXls(inputStream); } //數(shù)據(jù)保存 saveBatch(ehicleViolations); } catch (IOException e) { e.printStackTrace(); } return JsonResult.Success("導(dǎo)入成功"); }
- MultipartFile:這個(gè)類是Spring提供的,用于處理文件上傳。它代表了上傳的文件。
- 空文件檢查:首先檢查
multipartFile
是否為null
,以及文件的大小是否為0。如果是,返回錯(cuò)誤提示。 - 文件類型校驗(yàn):使用
getOriginalFilename()
獲取上傳文件的名稱,然后檢查其后綴是否為.xls
或.xlsx
。如果不符合條件,返回格式錯(cuò)誤的提示。 - 輸入流獲取:調(diào)用
multipartFile.getInputStream()
獲取文件的輸入流,準(zhǔn)備進(jìn)行后續(xù)解析。 - 文件解析:根據(jù)文件后綴名調(diào)用不同的解析方法:
- 如果是
.xlsx
,調(diào)用readXlsx()
方法。 - 如果是
.xls
,調(diào)用readXls()
方法。
- 如果是
- 數(shù)據(jù)保存:解析完畢后,調(diào)用
saveBatch()
將解析的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫。 - 異常處理:捕獲
IOException
,并打印堆棧信息??梢钥紤]在這里加上日志記錄或用戶友好的錯(cuò)誤信息。
3.主要解析的業(yè)務(wù)邏輯
①解析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會(huì)判斷單元格的類型,如果非字符串類型就會(huì)拋出上面的異常。 //所以先使用setCellType()方法先將該單元格的類型設(shè)置為STRING //然后poi會(huì)根據(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)建工作簿對(duì)象。 - 獲取工作表:使用
getSheetAt(0)
方法獲取第一個(gè)工作表。 - 創(chuàng)建列表:初始化一個(gè)
ArrayList<EhicleViolation>
用于存放解析后的數(shù)據(jù)。 - 讀取行數(shù)據(jù):使用
for
循環(huán)從第三行開始讀取數(shù)據(jù)(假設(shè)前兩行是標(biāo)題或無關(guān)信息),直到最后一行:- 獲取行對(duì)象:通過
sheetAt.getRow(rowNum)
獲取當(dāng)前行。 - 行非空檢查:確認(rèn)行對(duì)象不為空。
- 設(shè)置單元格類型:循環(huán)設(shè)置每個(gè)單元格的類型為字符串,以避免因數(shù)據(jù)類型不同而引發(fā)的異常(例如:嘗試讀取數(shù)值單元格為字符串)。
- 獲取行對(duì)象:通過
- 獲取單元格值:
- 讀取第2列(索引1)的值并調(diào)用
setUserDept
方法設(shè)置部門信息。 - 讀取第3列(索引2)的值并調(diào)用
setVehicleNumber
方法設(shè)置車輛編號(hào)。如果車輛編號(hào)為空,則跳過當(dāng)前行,繼續(xù)處理下一行。
- 讀取第2列(索引1)的值并調(diào)用
- 數(shù)據(jù)存儲(chǔ):將解析的
EhicleViolation
對(duì)象添加到ehicleViolations
列表中。 - 返回?cái)?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會(huì)判斷單元格的類型,如果非字符串類型就會(huì)拋出上面的異常。 //所以先使用setCellType()方法先將該單元格的類型設(shè)置為STRING //然后poi會(huì)根據(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)
獲取第一個(gè)工作表。 - 列表初始化:創(chuàng)建一個(gè)新的
ArrayList<EhicleViolation>
用于存放解析的數(shù)據(jù)。 - 讀取行數(shù)據(jù):與
readXls
方法相同的邏輯,循環(huán)遍歷從第三行開始到最后一行的所有行,讀取數(shù)據(jù)。 - 設(shè)置單元格類型和獲取值:使用相同的方式設(shè)置單元格類型并讀取所需的列。
- 數(shù)據(jù)存儲(chǔ):添加解析后的對(duì)象到列表并返回。
注意:對(duì)于不同的Execl Java提供了不同的解析對(duì)象
- xls使用HSSFWorkbook 對(duì)象進(jìn)行解析
- xlsx使用XSSWorkbook 對(duì)象進(jìn)行解析
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于@Component注解下的類無法@Autowired問題
這篇文章主要介紹了關(guān)于@Component注解下的類無法@Autowired問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03關(guān)于springboot中nacos動(dòng)態(tài)路由的配置
這篇文章主要介紹了springboot中nacos動(dòng)態(tài)路由的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java 中如何使用 JavaFx 庫標(biāo)注文本顏色
這篇文章主要介紹了在 Java 中用 JavaFx 庫標(biāo)注文本顏色,在本文中,我們將了解如何更改標(biāo)簽的文本顏色,并且我們還將看到一個(gè)必要的示例和適當(dāng)?shù)慕忉?,以便更容易理解該主題,需要的朋友可以參考下2023-05-05Java設(shè)計(jì)模式之橋接模式的實(shí)現(xiàn)
今天給大家?guī)淼奈恼率荍ava設(shè)計(jì)模式的相關(guān)知識(shí)點(diǎn),文中對(duì)橋接模式作了非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案
這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09SpringBoot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包的操作步驟
在開發(fā)過程中,需要不斷進(jìn)行環(huán)境的切換和打包部署,maven提供了多環(huán)境配置,可以方便實(shí)現(xiàn)不同環(huán)境的配置切換和打包,本文通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04