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

Spring?Boot?+?EasyExcel?+?SqlServer?進行批量處理數(shù)據(jù)的高效方法

 更新時間:2024年06月12日 12:09:12   作者:天縱云裳  
在日常開發(fā)和工作中,我們可能要根據(jù)用戶上傳的文件做一系列的處理,本篇文章就以Excel表格文件為例,主要介紹了Spring?Boot?+?EasyExcel?+?SqlServer?進行批量處理數(shù)據(jù)的高效方法,需要的朋友可以參考下

前言

在日常開發(fā)和工作中,我們可能要根據(jù)用戶上傳的文件做一系列的處理,本篇文章就以Excel表格文件為例,模擬用戶上傳Excel文件,講述后端如何高效的進行數(shù)據(jù)的處理。

一.引入 EasyExcel  依賴

        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.2</version>
        </dependency>

二.在接口中編寫代碼

(一).使用什么參數(shù)接收?

由于用戶上傳的是一個Excel文件,也就是說前端發(fā)來的是一個Excel表格的文件,那么我們后端就需要使用  MultipartFile file  來進行接收

 @PostMapping("/importExcelUpdateFlag")
    public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {
           //具體代碼......
    }

(二).如何存儲到本地目錄中(最后說為什么存儲到本地)

既然前端發(fā)來了一個Excel文件,后端需要對其進行重命名還有大量的數(shù)據(jù)處理,那么如何存儲到本地是一個問題。我們在三層架構(gòu)的基礎(chǔ)上,這個存儲到本地的工作一般放在 Service 層進行處理。

Controller層的代碼

下面的 uploadPath(也就是你要存儲到本地的目錄) 是自己在 yml文件中定義好的,然后進行使用,截圖如下:

@PostMapping("/importExcelUpdateFlag")
    public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {
        //把前端發(fā)來的文件數(shù)據(jù),傳到本機指定的 uploadPath 目錄之下
        String pathAndFileName = jdCloudService.uploadFile(file,uploadPath);
         //其他代碼....
    }

注意這里 pathAndFileName 接收的是一個本地路徑,后續(xù)需要根據(jù)這個路徑找到指定文件

Service 層的代碼

    @Override
    public String uploadFile(MultipartFile file, String uploadPath) {
        if(file.isEmpty()){
            return "上傳文件為空";
        }
        try {
            String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());
            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
            String newFilename = generateFilename() + fileExtension;
            File targetFile = new File(uploadPath + File.separator + newFilename);
            file.transferTo(targetFile);
            return uploadPath + "\\" + newFilename;
        } catch (Exception e) {
            return "文件上傳失敗: " +  e.getMessage();
        }
    }
    private String generateFilename() {
        // 根據(jù)你的需求生成新的文件名,例如使用時間戳或隨機字符串等,這里使用時間戳
        return String.valueOf("更新文件名.." + System.currentTimeMillis());
    }
代碼解讀:我們假設(shè)前端傳來了一個 hello.xlsx 文件

String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());這行代碼會將 "hello.xlsx " 賦值給 originalFilename 變量。

String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));

這行代碼會從 "hello.txt" 中提取出文件擴展名 ".txt",并將其賦值給 fileExtension 變量。

String newFilename = generateFilename() + fileExtension;

這行代碼會調(diào)用 generateFilename() 方法生成一個新的唯一文件名,例如 "abc123"。將生成的文件名 "abc123.xlsx" 與文件擴展名 ".txt" 拼接,賦值給 newFilename 變量。

File targetFile = new File(uploadPath + File.separator + newFilename);

假設(shè) uploadPath 是 "/path/to/uploads/"。這行代碼會創(chuàng)建一個 File 對象,代表文件的保存路徑和文件名 "/path/to/uploads/abc123.xlsx"。那么這個就會創(chuàng)建出文件了(但是沒有內(nèi)容)

file.transferTo(targetFile);

這行代碼會將用戶上傳的 "hello.xlsx" 文件的內(nèi)容,寫入到 "/path/to/uploads/abc123.xlsx" 文件中。

通過這樣的處理,原本名為 "hello.xlsx" 的文件會被保存為 "abc123.xlsx",并且保存在 "/path/to/uploads/" 目錄下。這樣可以避免文件名與現(xiàn)有文件發(fā)生沖突,確保文件上傳的安全性。

注意這里返回給 Controller 層的是一個本地目錄,是根據(jù)目錄來找到指定的文件!

三.假設(shè)需求

現(xiàn)在假設(shè)我們本地指定的目錄下面已經(jīng)有用戶上傳的文件了,那么我們要對這個文件進行一系列的處理。 現(xiàn)在假設(shè)我們的需求是根據(jù)Excel文件中用戶的 工號,更新用戶的 Flag 標簽(0變?yōu)?)

那么應該如何做呢?

繼續(xù)編寫代碼

Controller層

    @PostMapping("/importExcelUpdateFlag")
    public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {
        Map<String,Object> response = new HashMap<>();
        response.put("code",0);
        response.put("data",":");
        //把前端發(fā)來的文件數(shù)據(jù),傳到本機指定的 uploadPath 目錄之下
        String pathAndFileName = jdCloudService.uploadFile(file,uploadPath);
        if(pathAndFileName.equals("上傳文件為空") || pathAndFileName.equals("文件上傳失敗")) {
            response.put("msg",pathAndFileName);
            return response;
        }
        String feedBackMsg = jdCloudService.enableFlagUpdate(pathAndFileName);
        response.put("msg",feedBackMsg);
        return response;
    }

這里主要是 feedBackMsg,這個調(diào)用的 Service 層的代碼是處理表格數(shù)據(jù)的主要內(nèi)容,我們來看

Service層

    @Override
    public String enableFlagUpdate(String filename) {
        //獲取 PersonSynData 類的 Class 對象。
        Class<PersonSynData> head = PersonSynData.class;
        List<PersonSynData> updateList = new ArrayList<>();
        ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {
            @Override
            public void invoke(PersonSynData personSynData, AnalysisContext analysisContext) {
                updateList.add(personSynData);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("Excel解析完成......");
            }
        }).build();
        //創(chuàng)建 sheet 對象,并且讀取Excel的第一個sheet(下表從0開始),也可以根據(jù) sheet 名稱獲取
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        //讀取 sheet 表格數(shù)據(jù),參數(shù)是可變參數(shù),也可以讀取多個sheet
        //這個操作會讀取 excel 表格的數(shù)據(jù)
        excelReader.read(readSheet);
        //需要自己關(guān)閉流操作,在讀取文件的時候會創(chuàng)建臨時文件,如果不關(guān)閉的話,會損耗磁盤
        excelReader.finish();
    }

代碼解讀:

1.首先獲取到實體類的 class 對象,后續(xù)需要進行使用

2.updateList 是要存儲 Excel 表格中的每一行,每一行都是一個 實體類對象

3. ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {...});是Alibaba提供的一個工廠方法,用于創(chuàng)建一個 ExcelReader 對象。
filename 是要解析的 Excel 文件的路徑。
head 是前面獲取的 PersonSynData 類的 Class 對象,用于告訴 EasyExcel 應該如何解析 Excel 數(shù)據(jù)。
new AnalysisEventListener<PersonSynData>() {...} 是一個匿名內(nèi)部類,實現(xiàn)了 AnalysisEventListener 接口。這個監(jiān)聽器用于處理 Excel 數(shù)據(jù)的解析過程。

4. invoke 是必須重寫的方法

  • 每解析到一行 Excel 數(shù)據(jù),就會調(diào)用這個方法,并將解析后的 PersonSynData 實例作為參數(shù)傳遞進來。
  • 在這個方法中,我們將解析出的 PersonSynData 實例添加到 updateList 中。

5. doAfterAllAnalysed也是必須重寫的方法

  • 這個方法是 AnalysisEventListener 接口的 doAfterAllAnalysed 方法的實現(xiàn)。
  • 當 Excel 文件的所有數(shù)據(jù)都解析完成后,就會調(diào)用這個方法。
  • 在這個方法中,我們打印了一條消息,表示 Excel 解析完成。

6.當代碼執(zhí)行到  excelReader.read(readSheet); 此時 updateList 中就有我們需要的數(shù)據(jù)了

注意!更新操作在下一篇: http://www.fzitv.net/program/322571vt7.htm

四.為什么要緩存到本地?

緩存到本地和在內(nèi)存中進行處理是兩種不同的解決方案

在處理前端傳來的Excel文件時,后端是否需要將其存儲到本地再進行解析,確實存在幾種不同的處理方式。

存儲到本地后再解析:這種方式的優(yōu)點是可以避免在內(nèi)存中一次性加載整個Excel文件,從而減輕內(nèi)存壓力。同時,如果需要對文件進行多次處理,存儲到本地后可以直接讀取而無需重新上傳,提高效率。缺點是需要占用服務器硬盤空間,并且需要額外的IO操作。

直接在內(nèi)存中解析:這種方式可以省略存儲到本地的步驟,直接從前端傳來的數(shù)據(jù)流中進行解析。優(yōu)點是減少了IO操作,提高了處理速度。缺點是需要一次性加載整個Excel文件到內(nèi)存中,如果文件很大可能會造成內(nèi)存溢出的風險。

綜合來看,兩種方式各有優(yōu)缺點。具體采用哪種方式,需要根據(jù)實際業(yè)務需求、文件大小、服務器資源等因素進行權(quán)衡。如果Excel文件較小,且只需要處理一次,直接在內(nèi)存中解析可能是更好的選擇。而對于較大的Excel文件,或需要多次處理的場景,將其存儲到本地可能會更合適。總之,在設(shè)計后端處理邏輯時,需要充分考慮各種因素,選擇最佳的解決方案。

到此這篇關(guān)于Spring Boot + EasyExcel + SqlServer 進行批量處理數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Spring Boot EasyExcel 批量處理數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼

    JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼

    本篇文章主要介紹了JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼,非常具有實用價值,需要的朋友可以參考下。
    2017-03-03
  • 如何徹底刪除SVN中的文件和文件夾(附恢復方法)

    如何徹底刪除SVN中的文件和文件夾(附恢復方法)

    在SVN中如果刪除某個文件或文件夾也可以在歷史記錄中進行找回,有的時候需要徹底刪除某些文件,即不希望通過歷史記錄進行恢復,需要在服務器上對SVN的數(shù)據(jù)進行重新整理
    2014-08-08
  • Java實現(xiàn)簡易提款機

    Java實現(xiàn)簡易提款機

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易提款機,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 國內(nèi)分布式框架Dubbo使用詳解

    國內(nèi)分布式框架Dubbo使用詳解

    這篇文章主要為大家介紹了國內(nèi)分布式框架Dubbo使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • SpringBoot之瘦身部署的詳細步驟

    SpringBoot之瘦身部署的詳細步驟

    本篇文章主要介紹了SpringBoot之瘦身部署的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解Java?POI?excel自定義設(shè)置單元格格式

    詳解Java?POI?excel自定義設(shè)置單元格格式

    這篇文章主要介紹了Java?POI?excel設(shè)置單元格格式,自定義設(shè)置,設(shè)置單元格格式:來源_formats,更多數(shù)據(jù)類型從formats里面發(fā)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實現(xiàn)

    Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實現(xiàn)

    這篇文章主要介紹了Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring Boot實戰(zhàn)之模板引擎

    Spring Boot實戰(zhàn)之模板引擎

    這篇文章主要介紹了Spring Boot實戰(zhàn)之模板引擎,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • idea?與?maven?使用過程中遇到的問題及解決方案

    idea?與?maven?使用過程中遇到的問題及解決方案

    最近將IDEA 升級到 IntelliJ IDEA 2021.3.2,在將maven項目導入IDEA后,maven build時報異常,這個問題是IntelliJ IDEA 2021.3.2 不兼容導致的,下面小編給大家?guī)砹薸dea?與?maven?使用過程中遇到的問題及解決方案,感興趣的朋友一起看看吧
    2022-05-05
  • 最新評論

    西乡县| 都昌县| 大余县| 红安县| 长武县| 辽宁省| 涪陵区| 定襄县| 松滋市| 惠东县| 盈江县| 新晃| 龙井市| 定远县| 获嘉县| 金寨县| 衡阳市| 湖州市| 苗栗县| 县级市| 南江县| 应城市| 镇江市| 新疆| 平定县| 彩票| 唐海县| 会泽县| 揭阳市| 石家庄市| 文化| 织金县| 双城市| 民丰县| 平邑县| 长汀县| 左权县| 安岳县| 多伦县| 潜江市| 陵水|