最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何使用multipartFile對象解析Execl

 更新時(shí)間:2025年02月11日 09:42:00   作者:唯有遺忘最漫長  
本文介紹了如何使用Spring的MultipartFile類解析Excel文件(.xls和.xlsx),包括文件上傳、數(shù)據(jù)校驗(yàn)、輸入流獲取、文件解析、數(shù)據(jù)保存和異常處理的詳細(xì)步驟

Java使用multipartFile對象解析Execl

1.需要使用 multipartFile 包

package org.springframework.web.multipart;

2.數(shù)據(jù)校驗(yàn)

public String exportVehicleViol(MultipartFile multipartFile) {
        try {
            //對前端傳遞的文件進(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 "文件上傳格式有誤,請重新上傳";
            }
            List<EhicleViolation> ehicleViolations = null;
            InputStream inputStream = multipartFile.getInputStream();
            //根據(jù)文件格式 對應(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)建工作簿對象。
  • 獲取工作表:使用getSheetAt(0)方法獲取第一個(gè)工作表。
  • 創(chuàng)建列表:初始化一個(gè)ArrayList<EhicleViolation>用于存放解析后的數(shù)據(jù)。
  • 讀取行數(shù)據(jù):使用for循環(huán)從第三行開始讀取數(shù)據(jù)(假設(shè)前兩行是標(biāo)題或無關(guān)信息),直到最后一行:
    • 獲取行對象:通過sheetAt.getRow(rowNum)獲取當(dāng)前行。
    • 行非空檢查:確認(rèn)行對象不為空。
    • 設(shè)置單元格類型:循環(huán)設(shè)置每個(gè)單元格的類型為字符串,以避免因數(shù)據(jù)類型不同而引發(fā)的異常(例如:嘗試讀取數(shù)值單元格為字符串)。
  • 獲取單元格值
    • 讀取第2列(索引1)的值并調(diào)用setUserDept方法設(shè)置部門信息。
    • 讀取第3列(索引2)的值并調(diào)用setVehicleNumber方法設(shè)置車輛編號。如果車輛編號為空,則跳過當(dāng)前行,繼續(xù)處理下一行。
  • 數(shù)據(jù)存儲(chǔ):將解析的EhicleViolation對象添加到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ǔ):添加解析后的對象到列表并返回。

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

  • xls使用HSSFWorkbook 對象進(jìn)行解析
  • xlsx使用XSSWorkbook 對象進(jìn)行解析

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式

    Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式

    這篇文章主要介紹了Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信

    客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信

    這篇文章主要為大家介紹了客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • SpringBoot 設(shè)置傳入?yún)?shù)非必要的操作

    SpringBoot 設(shè)置傳入?yún)?shù)非必要的操作

    這篇文章主要介紹了SpringBoot 設(shè)置傳入?yún)?shù)非必要的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解

    Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解

    這篇文章主要為大家介紹了Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Spring中的Aware接口及應(yīng)用場景詳解

    Spring中的Aware接口及應(yīng)用場景詳解

    這篇文章主要介紹了Spring中的Aware接口及應(yīng)用場景,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • springboot熱部署知識點(diǎn)總結(jié)

    springboot熱部署知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了關(guān)于springboot熱部署的知識點(diǎn)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。
    2019-06-06
  • springboot實(shí)用配置詳細(xì)圖文教程

    springboot實(shí)用配置詳細(xì)圖文教程

    SpringBoot從本質(zhì)上來說就是Spring,它通過了一些自己的特性幫助我們簡化了Spring應(yīng)用程序的開發(fā),下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)用配置的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java使用Random類生成隨機(jī)數(shù)示例

    Java使用Random類生成隨機(jī)數(shù)示例

    這篇文章主要介紹了Java使用Random類生成隨機(jī)數(shù),結(jié)合實(shí)例形式分析了java基于Random類生成隨機(jī)數(shù)與遍歷輸出相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 微信小程序支付Jsapi下單Java版保姆級教程

    微信小程序支付Jsapi下單Java版保姆級教程

    微信支付作為國內(nèi)領(lǐng)先的第三方支付平臺(tái),為商戶提供了多樣化的支付解決方案,包括JSAPI支付、APP支付、H5支付、Native支付以及小程序支付,這篇文章主要介紹了微信小程序支付Jsapi下單Java版的相關(guān)資料,需要的朋友可以參考下
    2025-07-07
  • Spring boot整合security詳解

    Spring boot整合security詳解

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,本文主要介紹了SpringBoot整合Security安全框架的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

金溪县| 凤翔县| 临夏市| 汤原县| 莒南县| 江阴市| 长兴县| 临西县| 崇明县| 定襄县| 那曲县| 芒康县| 平远县| 嵩明县| 龙井市| 南涧| 镇巴县| 达拉特旗| 汾阳市| 芦山县| 信阳市| 洛阳市| 尖扎县| 红安县| 横峰县| 广南县| 奈曼旗| 宜春市| 青海省| 红安县| 丰台区| 睢宁县| 江西省| 松桃| 平顺县| 新乡市| 育儿| 盖州市| 江源县| 乌鲁木齐县| 天长市|