入門alibaba的EasyExcel

一、關於EasyExcel
1、什麼是EasyExcel,有什麼作用?

    EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。在儘可能節約內存的情況下支持讀寫百M的Excel。

2、爲什麼選擇EasyExcel,而不是Apache poi或者jxl?

    Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗內存,poi有一套SAX模式的API可以一定程度的解決一些內存溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後存儲都是在內存中完成的,內存消耗依然很大。easyexcel重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右內存降低到幾M,並且再大的excel不會出現內存溢出,03版依賴POI的sax模式。在上層做了模型轉換的封裝,讓使用者更加簡單方便。

3、怎樣使用?

    以下章節能讓你快速使用EasyExcel對excel文件進行讀寫操作。

二、入門EasyExcel
1、新建一個maven項目、導入easyexcel的jar包。

maven項目的jar包可以在https://mvnrepository.com/裏面搜索,能快速的搜索到想要的jar包,以及版本。

我這裏選擇的是當前最新的2.1.4版本。

2、新建一個實體類

package com.hgl.entity;

import java.util.Date;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;

// 表示列寬
@ColumnWidth(20)
public class UserEntity {    
    
    // index--表示屬性在第幾列,value--表示標題
    @ExcelProperty(value = "姓名", index = 0)
    private String name;
    
    // @DateTimeFormat--對日期格式的轉換
    @DateTimeFormat("yyyy-MM-dd")
    @ExcelProperty(value = "生日", index = 1)
    private Date birthday;

    @ExcelProperty(value = "電話", index = 2)
    private String telphone;
    
    // @NumberFormat--對數字格式的轉換
    @NumberFormat("#.##")
    @ExcelProperty(value = "工資", index = 3)
    private double salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getTelphone() {
        return telphone;
    }

    public void setTelphone(String telphone) {
        this.telphone = telphone;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    
}

3、提供一個供外部調用寫入Excel的接口

package com.hgl.controller;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.excel.EasyExcel;
import com.google.common.collect.Lists;
import com.hgl.entity.UserEntity;

@RestController
@RequestMapping("/excel")
public class ExcelWriteController{


    /**
     * 測試寫入Excel文件
     * 
     * @param response
     * @throws IOException
     */
    @GetMapping("/download")
    public void doDownLoad(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("第一個文件", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), UserEntity.class).sheet("模板").doWrite(getData());
    }

    /**
     * 構造假數據,實際上應該從數據庫查出來
     * 
     * @return List<UserEntity>
     */
    private List<UserEntity> getData(){
        List<UserEntity> users = Lists.newArrayList();
        for (int i = 1; i <= 9; i++) {
            UserEntity user = new UserEntity();
            user.setBirthday(new Date());
            user.setName("user_" + i);
            user.setSalary(1.285 * i);
            user.setTelphone("1888888888" + i);
            users.add(user);
        }
        return users;
    }
}

下載結果:

4、提供一個供外部調用讀取Excel的接口 

首先需要寫一個監聽器:

package com.hgl.listener;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.hgl.entity.UserEntity;

/**
 * 1、注意監聽器不能由spring容器管理,每次調用時都需要手動new
 * 2、監聽器內部需要使用ioc中的bean時,可以通過構造方法傳入
 * 
 * @author guilin
 *
 */
public class UserListener extends AnalysisEventListener<UserEntity>{
    
    private List<UserEntity> data = Lists.newArrayList();
    
    private static final Logger LOGGER = LoggerFactory.getLogger(UserListener.class);
    
    /**
     *    解析每條數據時都會調用 
     */
    @Override
    public void invoke(UserEntity user, AnalysisContext context) {
        data.add(user);
    }

    /**
     *    所有數據解析完之後調用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 可以在此處執行業務操作
        // 本例就打印到控制檯即可,表示讀取完成
        LOGGER.info(JSON.toJSONString(data));
    }

讀取方法:

package com.hgl.controller;

import java.io.IOException;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.excel.EasyExcel;
import com.hgl.entity.UserEntity;
import com.hgl.listener.UserListener;

@RestController
@RequestMapping("/excel")
public class ExcelReadController {
    
    /**
     * 測試讀取Excel文件
     * 
     * @param file
     * @return String
     */
    @PostMapping("/read")
    public String doDownLoad(MultipartFile file) throws IOException {
         EasyExcel.read(file.getInputStream(), UserEntity.class, new UserListener()).sheet().doRead();
         return "success";
    }

使用postman測試讀數據:

成功讀到數據:

三、收尾
這篇文章提供了最簡單的使用EasyExcel進行讀寫操作的例子,更多使用方法請參考官方文檔或開源社區。

附上官方文檔地址:https://alibaba-easyexcel.github.io/

GitHub開源地址:https://github.com/alibaba/easyexcel
————————————————
版權聲明:本文爲CSDN博主「與李」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_37171817/article/details/103664106

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章