阿里的Easyexcel讀取Excel文件(最新版本)

  本篇文章主要介紹一下使用阿里開源的Easyexcel工具處理讀取excel文件,因為之前自己想在網上找一下這個簡單的立即上手的部落格,發現很多文章的教程都針對比較舊的版本的Easyexcel,沒有使用新版本的方法,導致很多方法都標誌過期了或者運行時報錯,所以本篇部落格主要是使用最新版的Easyexcel去讀取excel文件,順便說一下目前新版本的特性。

優化

  1. 目前讀取excel文件不再需要指定ExcelTypeEnum,即excel的版本,會自動處理
  2. 之前創建ExcelReader都是自己new,現在是通過EasyExcelFactory創建,更加簡單和具備通用性。
  3. 之前每解析一行的回調的invoke()方法,通用對象Object是list集合,目前是HashMap集合。

在這裡插入圖片描述

簡單使用讀取Excel,返回List集合

  1. 通過maven引入依賴
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.0.5</version>
        </dependency>
  1. 新建通用監聽類StringExcelListener

    /**
     * StringList 解析監聽器
     *
     * @author zhangcanlong
     * @since 2019-10-21
     */
    private static class StringExcelListener extends AnalysisEventListener {

        /**
         * 自定義用於暫時存儲data
         * 可以通過實例獲取該值
         */
        private List<List<String>> datas = new ArrayList<>();

        /**
         * 每解析一行都會回調invoke()方法
         *
         * @param object  讀取後的數據對象
         * @param context 內容
         */
        @Override
        public void invoke(Object object, AnalysisContext context) {
            @SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
            //數據存儲到list,供批量處理,或後續自己業務邏輯處理。
            datas.add(new ArrayList<>(stringMap.values()));
            //根據自己業務做處理
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            //解析結束銷毀不用的資源
            //注意不要調用datas.clear(),否則getDatas為null
        }

        /**
         * 返回數據
         *
         * @return 返回讀取的數據集合
         **/
        public List<List<String>> getDatas() {
            return datas;
        }

        /**
         * 設置讀取的數據集合
         *
         * @param datas 設置讀取的數據集合
         **/
        public void setDatas(List<List<String>> datas) {
            this.datas = datas;
        }
    }
  1. 創建ExcelReader讀取,並從監聽類中獲取讀取的數據
    /**
     * 根據excel輸入流,讀取excel文件
     *
     * @param inputStream exece表格的輸入流
     * @return 返回雙重list的集合
     **/
    public List<List<String>> writeWithoutHead(InputStream inputStream) {
        StringExcelListener listener = new StringExcelListener();
        ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
        excelReader.read();
        List<List<String>> datas = listener.getDatas();
        excelReader.finish();
        return datas;
    }

完整的Excel簡單讀取類和測試

測試類:


import com.hiido.services.common.ExcelOptionsService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

/**
 * excel操作的測試類
 *
 * @author zhangcanlong
 * @since 2019/10/20 21:12
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ExcelOptionsServiceTest {

    @Autowired
    private ExcelOptionsService excelOptionsService;

    /**
     * 測試讀取excel
     **/
    @Test
    public void testReadExcel() {
        // 這裡的excel文件可以 為xls或xlsx結尾
        File file = new File("C:\\Users\\Administrator\\Desktop\\測試.xls");
        List<List<String>> result = new ArrayList<>();
        try {
            result = excelOptionsService.writeWithoutHead(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Assert.assertNotNull(result);
        System.out.println("讀取結果:" + result);
    }
}

讀取類


import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * excel文件的操作service
 *
 * @author zhangcanlong
 * @since 2019/10/20 21:01
 **/
@Service
public class ExcelOptionsService {

    /**
     * 根據excel輸入流,讀取excel文件
     *
     * @param inputStream exece表格的輸入流
     * @return 返回雙重list的集合
     **/
    public List<List<String>> writeWithoutHead(InputStream inputStream) {
        StringExcelListener listener = new StringExcelListener();
        ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
        excelReader.read();
        List<List<String>> datas = listener.getDatas();
        excelReader.finish();
        return datas;
    }

    /**
     * StringList 解析監聽器
     *
     * @author zhangcanlong
     * @since 2019-10-21
     */
    private static class StringExcelListener extends AnalysisEventListener {

        /**
         * 自定義用於暫時存儲data
         * 可以通過實例獲取該值
         */
        private List<List<String>> datas = new ArrayList<>();

        /**
         * 每解析一行都會回調invoke()方法
         *
         * @param object  讀取後的數據對象
         * @param context 內容
         */
        @Override
        public void invoke(Object object, AnalysisContext context) {
            @SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
            // 這裡可以獲取excel的基本資訊,包含excel的總行數
            System.out.println("不一定十分準確的總行數:"+context.getTotalCount());
            //數據存儲到list,供批量處理,或後續自己業務邏輯處理。
            datas.add(new ArrayList<>(stringMap.values()));
            //根據自己業務做處理
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            //解析結束銷毀不用的資源
            //注意不要調用datas.clear(),否則getDatas為null
        }

        /**
         * 返回數據
         *
         * @return 返回讀取的數據集合
         **/
        public List<List<String>> getDatas() {
            return datas;
        }

        /**
         * 設置讀取的數據集合
         *
         * @param datas 設置讀取的數據集合
         **/
        public void setDatas(List<List<String>> datas) {
            this.datas = datas;
        }
    }
}

參考:

  1. //blog.csdn.net/alinyua/article/details/82859577
  2. //github.com/alibaba/easyexcel/blob/master/quickstart.md

CrudBoys

Tags: