Springboot整合easyExcel導入導出Excel

2021-02-13 Java資料站

點擊上方藍色字體,選擇「標星公眾號」

優質文章,第一時間送達

  作者 |  Code2020

來源 |  urlify.cn/BFnIrq

背景:

最近公司有個需求要求可以導入、導出excel,因此在此記錄學習一下如何使用Springboot整合easyExcel;
需求:
資料庫中有張user表,有個業務要求可以導入、導出「用戶名單.xls」表

一、準備:

創建項目:
關於springboot項目如何創建這裡不再贅述,放一張項目結構圖:
1、導入easyexcel、mybatis、mysql依賴

  <!-- easyexcel相關依賴 -->
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>1.1.2-beta5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
  <!-- mybatis、mysql相關依賴 -->
  <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

2、application.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

3、導出excel

(1)user實體類
導出 Excel 時,若需要表頭,那麼相應的實體類需要繼承 BaseRowModel,並加入 @ExcelProperty(value = 「id」, index = 0) 註解。其中 value 代表在導出 Excel 時,該欄位對應的表頭名稱;index 代表該欄位對應的表頭位置(從0開始)。如下圖:

//@Data是lombok的一個註解,加上它會自動生成getter、setter方法
@Data
public class User extends BaseRowModel {
    @ExcelProperty(value = "ID", index = 0)
    private String id;
    @ExcelProperty(value = "姓名", index = 1)
    private String name;
    @ExcelProperty(value = "年齡", index = 2)
    private Integer age;
}

(2)Usercontroller

    @GetMapping("/user/excel")
    public void excelExport(HttpServletResponse response) throws IOException {
        userService.excelExport(response);
    }

(3)Userservice

public void excelExport(HttpServletResponse response) throws IOException {
        List<User> list = userDao.queryAllUsers();
        String fileName = "用戶名單";
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xls");
        ServletOutputStream out = response.getOutputStream();
        ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLS,true);
        Sheet sheet = new Sheet(1,0,User.class);
        //設置自適應寬度
        sheet.setAutoWidth(Boolean.TRUE);
        sheet.setSheetName("用戶名單");
        writer.write(list,sheet);
        writer.finish();
        out.flush();
        response.getOutputStream().close();
        out.close();
    }

4、導入excel

(1)Usercontroller

   @PostMapping("/user/excel")
    public String excelImport(@RequestParam("file")MultipartFile file) throws IOException {
        userService.excelImport(file);
        return "success";
    }

(2)Userservice

public void excelImport(MultipartFile file) throws IOException {
        if(!file.getOriginalFilename().equals("用戶名單.xls") && !file.getOriginalFilename().equals("用戶名單.xlsx") ){
            return;
        }
        InputStream inputStream = new BufferedInputStream(file.getInputStream());
        //實例化實現了AnalysisEventListener接口的類
        ExcelListener excelListener = new ExcelListener(userDao);
        ExcelReader reader = new ExcelReader(inputStream,null,excelListener);
        //讀取信息
        reader.read(new Sheet(1,1,User.class));
    }

參考easyExcel官方GitHub demo
(3)ExcelListener

public class ExcelListener extends AnalysisEventListener<User> {
    private List<User> datas = new ArrayList<>();
    private static final int BATCH_COUNT = 3000;
    private UserDao userDao;

    public ExcelListener(UserDao userDao){
        this.userDao = userDao;
    }

    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        //數據存儲到datas,供批量處理,或後續自己業務邏輯處理。
        datas.add(user);
        //達到BATCH_COUNT了,需要去存儲一次資料庫,防止數據幾萬條數據在內存,容易OOM
        if(datas.size() >= BATCH_COUNT){
            saveData();
            // 存儲完成清理datas
            datas.clear();
        }
    }

    private void saveData() {
        for(User user : datas){
            userDao.addUser(user);
        }
    }

    public List<User> getDatas() {
        return datas;
    }

    public void setDatas(List<User> datas) {
        this.datas = datas;
    }

    /**
     * 所有數據解析完成了 都會來調用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();//確保所有數據都能入庫
    }
}

二、測試

剛開始的資料庫表:

準備一個「用戶名單.xls」表,以便待會測試導入功能:

1、 啟動項目,使用postman測試「導入」功能:


點擊send,然後查看數據表:

上圖數據一致,說明導入成功!!!

2、再用postman測試導出功能:

沒有參數,直接send,然後可以看到:



將其下載下來查看(本來這裡的文件名應該是代碼中命名的「用戶名單.xls」,但我嘗試了很久總是沒有變。。。)

與資料庫表數據一致,說明導出成功!

特別說明:

這裡的excel名字的命名必須是這個,而且裡面的主鍵可以不寫,因為可能會遇到主鍵衝突的問題

 

粉絲福利:實戰springboot+CAS單點登錄系統視頻教程免費領取

👇👇👇

感謝點讚支持下哈 

相關焦點

  • SpringBoot整合EasyPoi實現Excel的導入和導出(帶圖片)
    點擊上方藍色字體,選擇「標星公眾號」優質文章,第一時間送達66套java從入門到精通實戰課程分享前言實際工作中可能會用到Excel的導入和導出功能EasyPoi文檔:http://easypoi.mydoc.io/項目地址:https://gitee.com/lihongmin5211/springboot_easypoi準備工作環境:SpringBoot2.4.0、jdk8、Mysql5.7表結構:
  • 牛逼的EasyExcel,讓Excel導入導出更加簡單,附詳細教程!
    EasyExcel在做excel導入導出的時候,發現項目中封裝的工具類及其難用,於是去gitHub上找了一些相關的框架,最終選定了EasyExcel。之前早有聽聞該框架,但是一直沒有去了解,這次藉此學習一波,提高以後的工作效率。
  • SpringBoot搭配EasyExcel,一切表格就這麼完美解決了~
    github地址:https://github.com/alibaba/easyexcel# EasyExcel控制表格註解@ContentRowHeight(int):設置 row 高度,不包含表頭標記在 類上@ContentRowHeight
  • 優雅 | 今天很水的文章-Excel導入導出
    前端部分這裡闡述前端部分導入,導出,生成Excel表格這裡使用的是一個js-xlsx插件,所以這裡進行嘗試。exceldownloadExl = () => { const { results } = this.props //需要導出的json數據 let datas = _.clone(results)//這裡為了不影響項目的數據的使用 採用了lodash中的深克隆方法 let json = datas.map(item=> { //將json
  • 如何使用JavaScript實現前端導入和導出excel文件
    使用JavaScript實現前端基於Table數據一鍵導出excel文件同樣的, 我們實現將table數據一鍵導出為excel也是類似, 不過方案有所不同, 我們先來看看在Dooring中的實現效果.2.1 一鍵導出為excel實現效果以上就是用戶基於後臺採集到的數據, 一鍵導出excel文件的流程, 最後一張圖是生成的excel文件在office軟體中的呈現.
  • 【R包薈萃】Excel文件的批量導入與導出:openxlsx包實用技巧
    本期主要為大家介紹導入和導出excel文件的工具:openxlsx包,以及批量導入導出文件的一些小技巧。install.packages("openxlsx")library("openxlsx")導出excel文件使用的是write.xlsx函數,通過介紹我們可以看到該函數主要是將數據框導出為xlsx文件,同時由於excel可存在多個sheet,該函數也支持導出a list of data.frames。
  • 沒想到啊,Java操作Excel竟然這麼簡單!
    前言在工作中,使用excel表格處理數據是很常見的操作,本文就來講解下如何使用開源輪子實現下載、導入、導出的功能。項目介紹easyexcel是一款快速、簡單避免OOM的java處理Excel工具github地址:https://github.com/alibaba/easyexcelStart:15.2k
  • SpringBoot使用EasyExcel讀取excel表格中的數據到資料庫中
    -- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel<
  • EasyPOI:Excel/Word 導入/導出, 註解使用,完美,便捷,高效
    ,easyPoi 功能如同名字easy,主打的功能就是容易。讓一個沒接觸過poi的人員就可以方便的寫出Excel導出,Excel導出,Excel導入,Word模板導出,通過簡單的註解和模板語言(熟悉的表達式語法),完成以前複雜的寫法;    提供下官網地址,方便查閱最新動態以及細節問題:    關於easypoi可參考http://easypoi.mydoc.io/
  • NPOI 導出 excel 性能測試
    excel 性能測試Intro網上看到很多人說 NPOI 的性能不行,自己寫了一個 NPOI 的擴展庫,於是想嘗試看看 NPOI 的性能究竟怎麼樣,道聽途說始終不如自己動手一試。= new ExcelPackage(); var sheet = excel.Workbook.Worksheets.Add("tempSheet"); for (var i = 1; i <= RowsCount; i++) { for (var j = 1; j <
  • excel圖片導出的方法
            excel教程中圖片導出的操作應該怎樣進行呢?  假設一個excel工作表中有上百張圖片,如何批量導出到某一文件夾呢?  excel圖片導出的方法如下介紹。
  • R語言數據導入與導出
    R語言數據導入與導出整這麼一個系列,還是因為學R語言時遇到過一個非常「小白友好」的網站「DataScience Made Simple」。相信很多人搜到過這個網站,或許你在意到或許並沒在意。年前試著和作者發了一封郵件,想要把他這個網站做成漢語版的帖子發在公眾號上,讓我感動的是作者團隊欣然同意。於是就想著搞這麼一個系列,能不能堅持下來還不好說……且行且珍惜吧。
  • Spring Boot使用EasyExecl導出Execl
    在做後臺管理系統的時候,很多場景都會遇到Execl的導入和導出,如果在以前的話,我們基本都是用POI這個組件,不得不說,這個組件的功能確實強大,但是也有有一些弊端,比如內存佔用高、文件過大會導致OOM。後來,阿里開源的EasyExecl就能很好解決這些問題。
  • 手機號碼,怎麼一鍵導入到Excel表格中?
    手機號碼導出步驟:1、安裝軟體在電腦和手機端均安裝360手機助手2、建立手機和電腦連接打開電腦端手機助手,點【立即連接】按鈕,然後打開手機端360手機助手,用頂端的掃一掃功能掃二維碼連接(或用USB線連接手機)
  • 數據科學 | pandas數據導入與導出
    當我們開始著手做一個數據分析項目時,選擇和導入數據集是第一個步驟,而導出數據雖然非必需,但有時候我們也需要保存處理或者分析後的結果,方便下次使用。在pandas中,它已經為我們提供了很多不同格式數據的導入和導出方法,下面這篇文章將具體介紹一些較為常用的方法,包括excel、csv文件以及資料庫的導入導出等。數據導入和導出是pandas中很基礎且重要的一個部分。
  • ng-notadd 0.15 發布,新增表格及 excel 導出
    新功能普通表格數據表格動態表格excel 導出 (可指定行,列)功能技術棧TypescriptAngular
  • C 導出 Excel 的 6 種簡單方法!你會幾種?
    【CSDN 編者按】C# 導出 Excel 的6種簡單方法:數據表導出到 Excel,對象集合導出到 Excel,資料庫導出到 Excel,微軟網格控制項導出到 Excel,數組導出到 Excel,CSV 導出到 Excel,你都會了嗎?
  • 後端:Hutool Java 工具類庫導出 Excel,超級簡單!
    在開發應用系統的時候,導出文件是必不可放的功能。以前用過POI、easyexcel等工具的導入導出功能,但總感覺太麻煩了,代碼特別多,感覺並不是很好用。writer.merge(2, "申請人員信息"); // 一次性寫出內容,使用默認樣式,強制輸出標題 writer.write(list, true); //out為OutputStream,需要寫出到的目標流 //response為HttpServletResponse對象 response.setContentType("application/vnd.ms-excel
  • Hutool Java 工具類庫導出 Excel,超級簡單!
    來源:toutiao.com/i6771298852050829835前言在開發應用系統的時候,導出文件是必不可放的功能以前用過POI、easyexcel等工具的導入導出功能,但總感覺太麻煩了,代碼特別多,感覺並不是很好用。今天給大家介紹一款新工具,java工具類庫Hutool。
  • 如何把excel表格導入word? Excel的表格導入word圖文教程
    如何把excel表格導入word? Excel的表格導入word圖文教程時間:2017-07-11 13:30   來源:三聯   責任編輯:沫朵 川北在線核心提示:原標題:如何把excel表格導入word? Excel的表格導入word圖文教程 如何把excel表格導入word?