SpringBoot整合EasyExcel進行大數據處理的方法詳解

EasyExcel

EasyExcel文檔

我用過Poi和EasyPoi這些工具總體來說:

  • POI 優點我覺得自由,但是迎來的就是復雜度,和大數據量時候性能的缺點
  • EasyPoi基於POI 的二次封裝,解決瞭大部分的常用場景,簡化瞭代碼,但是特別復雜表格處理還是不行,而且性能的話和poi差不多,簡單來說就是簡化瞭Poi的操作,少些點代碼

下面來說說今天的主角EasyExcel,這個項目是阿裡巴巴開發的開源的,專門針對大數據批量處理,比如100萬+的Excel數據這種,會比以上幾款要快很多並且性能上也不會太占用系統的資源,但是不好的地方就是,處理不瞭復雜的表單 ,不能像poi那麼自由,所以有得有失,基本日常所需都能辦到,特殊場景在可以使用模板的方式,或者使用poi也行

主流操作的excel格式

下面這種分組的也能讀取,但是需要跳過前兩行的標題

下面演示,基礎的入門讀和寫案例, 需要對數據進行特殊處理,多Sheet,或者同步等需要參考文檔,基礎會瞭看文檔就簡單瞭

需要的Maven

    <dependencies>
        <!--        開發web 項目和啟動Springboot必須添加的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.3.graal</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

基礎讀案例

操作的excel

實體類

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeesEntity {
    @ExcelProperty(index = 0)
    private Integer no;  //工號
    @ExcelProperty(index = 1)
    private String name;
    @ExcelProperty(index = 2)
    private Double fund;
    @ExcelProperty(index = 3)
    private Double postSalary;
    @ExcelProperty(index = 4)
    private Double performanceOf;
    @ExcelProperty(index = 5)
    private Double allWork;
    @ExcelProperty(index = 6)
    private Double violations;
    @ExcelProperty(index = 7)
    private Double traffic;
    @ExcelProperty(index = 8)
    private Double communication;
}

讀取監聽器

一般是異步讀取,可以指定同步讀取數據(看文檔)

public class EmployeesListener extends AnalysisEventListener<EmployeesEntity> {


    /**
     * 這個每一條數據解析都會來調用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(EmployeesEntity data, AnalysisContext context) {
        System.out.println("解析到一條數據:"+JSON.toJSONString(data));
    }

    /**
     * 所有數據解析完成瞭 都會來調用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }


}

測試

    @Test
    public void get(){
        File file = new File("./src/main/resources/大客戶部-薪酬表.xlsx");
        String absolutePath = file.getAbsolutePath();
//        // 這裡 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉
        EasyExcel.read(absolutePath, EmployeesEntity.class, new EmployeesListener()).sheet().doRead();

    }

基礎寫案例

寫可以指定Sheet進行寫,還可以指定列進行寫,還可以寫入圖片,簡單的合並單元格…下面教程默認寫入第一個Sheet中

實體類

@ExcelProperty("字符串標題") 列的標題

@Data
public class DemoData {
    @ExcelProperty("字符串標題")
    private String string;
    @ExcelProperty("日期標題")
    private Date date;
    @ExcelProperty("數字標題")
    private Double doubleData;
    /**
     * 忽略這個字段
     */
    @ExcelIgnore
    private String ignore;
}

測試

//生成模擬數據
    private List<DemoData> data() {
        List<DemoData> list = new ArrayList<DemoData>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * 最簡單的寫
     * <p>1. 創建excel對應的實體對象 參照{@link DemoData}
     * <p>2. 直接寫即可
     */
    @Test
    public void simpleWrite() {
        // 寫
        File file = new File("./src/main/resources/DemoData.xlsx");
        // 這裡 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字為模板 然後文件流會自動關閉
        // 如果這裡想使用03 則 傳入excelType參數即可
        EasyExcel.write(file.getAbsolutePath(), DemoData.class).sheet("DemoData").doWrite(data());

    }

Excel模板方式

一般特別復雜的excel,比如發票,等, 一般就需要使用模板的方式,如果使用代碼的話太復雜瞭

準備模塊

實體類

@Data
public class FillData {
    private String name;
    private double number;
}

測試

    @Test
    public void simpleFill() {
        // 模板註意 用{} 來表示你要用的變量 如果本來就有"{","}" 特殊字符 用"\{","\}"代替
        File templateFileName  = new File("./src/main/resources/模板.xlsx");

        File fill  = new File("./src/main/resources/fillData.xlsx");
        // 這裡 會填充到第一個sheet, 然後文件流會自動關閉
        FillData fillData = new FillData();
        fillData.setName("張三");
        fillData.setNumber(5.2);
        EasyExcel.write(fill.getAbsolutePath()).withTemplate(templateFileName.getAbsolutePath()).sheet().doFill(fillData);

    }

如果是統計表,而且標題是非常復雜的情況下,那麼我們使用列表填充會很容易解決(自行看文檔)

到此這篇關於SpringBoot整合EasyExcel進行大數據處理的方法詳解的文章就介紹到這瞭,更多相關SpringBoot EasyExcel大數據處理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: