天天看點

poi、easypoi和easyexcel的使用

原文出自:公衆号 Java極客技術

原文連結:

https://mp.weixin.qq.com/s/-cRylMG87F07JWRxraWIOA

一、介紹

在平時的業務系統開發中,少不了需要用到導出、導入excel功能,今天我們就一起來總結一下,如果你正為此需求感到困惑,那麼閱讀完本文,你一定會有所收獲!

二、poi

大概在很久很久以前,微軟的電子表格軟體 Excel 以操作簡單、存儲資料直覺友善,還支援列印報表,在誕生之初,可謂深得辦公室裡的白領青睐,極大的提升了工作的效率,不久之後,便成了辦公室裡的必備工具。

随着更多的新語言的崛起,例如我們所熟悉的 java,後來便有一些團隊開始開發一套能與 Excel 軟體無縫切換的操作工具!

這其中就有我們所熟悉的 apache 的 poi,其前身是 Jakarta 的 POI Project項目,之後将其開源給 apache 基金會!

當然,在java生态體系裡面,能與Excel無縫銜接的第三方工具還有很多,因為 apache poi 在業界使用的最廣泛,是以其他的工具不做過多介紹!

話不多說,直接開撸!

2.1、首先引入apache poi的依賴

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
<dependencies>
    <!--xls(03)-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <!--xlsx(07)-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
    <!--時間格式化工具-->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.6</version>
    </dependency>
</dependencies>      

檢視代碼

2.2、導出excel

導出操作,即使用 Java 寫出資料到 Excel 中,常見場景是将頁面上的資料導出,這些資料可能是财務資料,也可能是商品資料,生成 Excel 後傳回給使用者下載下傳檔案。

在 poi 工具庫中,導出 api 可以分三種方式

  • HSSF方式:這種方式導出的檔案格式為office 2003專用格式,即.xls,優點是導出資料速度快,但是最多65536行資料
  • XSSF方式:這種方式導出的檔案格式為office 2007專用格式,即.xlsx,優點是導出的資料不受行數限制,缺點導出速度慢
  • SXSSF方式:SXSSF 是 XSSF API的相容流式擴充,主要解決當使用 XSSF 方式導出大資料量時,記憶體溢出的問題,支援導出大批量的excel資料

2.2.1、HSSF方式導出

HSSF方式,最多隻支援65536條資料導出,超過這個條數會報錯!

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelWrite2003Test {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //時間
        long begin = System.currentTimeMillis();

        //建立一個工作簿
        Workbook workbook = new HSSFWorkbook();
        //建立表
        Sheet sheet = workbook.createSheet();
        //寫入資料
        for (int rowNumber = 0; rowNumber < 65536; rowNumber++) {
            //建立行
            Row row = sheet.createRow(rowNumber);
            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                //建立列
                Cell cell = row.createCell(cellNumber);
                cell.setCellValue(cellNumber);
            }
        }
        System.out.println("over");

        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "使用者資訊表2003BigData.xls");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        long end = System.currentTimeMillis();
        System.out.println((double) (end - begin) / 1000);//4.29s
    }
}      

檢視代碼

2.2.2、XSSF方式導出

XSSF方式支援大批量資料導出,所有的資料先寫入記憶體再導出,容易出現記憶體溢出!

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelWrite2007Test {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //時間
        long begin = System.currentTimeMillis();

        //建立一個工作簿
        Workbook workbook = new XSSFWorkbook();
        //建立表
        Sheet sheet = workbook.createSheet();
        //寫入資料
        for (int rowNumber = 0; rowNumber < 65537; rowNumber++) {
            Row row = sheet.createRow(rowNumber);
            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                Cell cell = row.createCell(cellNumber);
                cell.setCellValue(cellNumber);
            }
        }
        System.out.println("over");

        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "使用者資訊表2007BigData.xlsx");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        long end = System.currentTimeMillis();
        System.out.println((double) (end - begin) / 1000);//15.87s
    }
}      

檢視代碼

2.2.3、SXSSF方式導出

SXSSF方式是XSSF方式的一種延伸,主要特性是低記憶體,導出的時候,先将資料寫入磁盤再導出,避免報記憶體不足,導緻程式運作異常,缺點是運作很慢!

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelWriteSXSSFTest {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //時間
        long begin = System.currentTimeMillis();

        //建立一個工作簿
        Workbook workbook = new SXSSFWorkbook();

        //建立表
        Sheet sheet = workbook.createSheet();

        //寫入資料
        for (int rowNumber = 0; rowNumber < 100000; rowNumber++) {
            Row row = sheet.createRow(rowNumber);
            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                Cell cell = row.createCell(cellNumber);
                cell.setCellValue(cellNumber);
            }
        }
        System.out.println("over");

        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "使用者資訊表2007BigDataS.xlsx");
        workbook.write(fileOutputStream);
        fileOutputStream.close();


        long end = System.currentTimeMillis();
        System.out.println((double) (end - begin) / 1000);//6.39s
    }
}      

檢視代碼

2.3、導入excel

導入操作,即将 excel 中的資料采用java工具庫将其解析出來,進而将 excel 資料寫入資料庫!

同樣,在 poi 工具庫中,導入 api 也分三種方式,與上面的導出一一對應!

2.3.1、HSSF方式導入

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelRead2003Test {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //擷取檔案流
        FileInputStream inputStream = new FileInputStream(PATH + "使用者資訊表BigData.xls");

        //1.建立工作簿,使用excel能操作的這邊都看看操作
        Workbook workbook = new HSSFWorkbook(inputStream);
        //2.得到表
        Sheet sheet = workbook.getSheetAt(0);
        //3.得到行
        Row row = sheet.getRow(0);
        //4.得到列
        Cell cell = row.getCell(0);
        getValue(cell);
        inputStream.close();
    }

    public static void getValue(Cell cell){
        //比對類型資料
        if (cell != null) {
            CellType cellType = cell.getCellType();
            String cellValue = "";
            switch (cellType) {
                case STRING: //字元串
                    System.out.print("[String類型]");
                    cellValue = cell.getStringCellValue();
                    break;
                case BOOLEAN: //布爾類型
                    System.out.print("[boolean類型]");
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                    break;
                case BLANK: //空
                    System.out.print("[BLANK類型]");
                    break;
                case NUMERIC: //數字(日期、普通數字)
                    System.out.print("[NUMERIC類型]");
                    if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期
                        System.out.print("[日期]");
                        Date date = cell.getDateCellValue();
                        cellValue = new DateTime(date).toString("yyyy-MM-dd");
                    } else {
                        //不是日期格式,防止數字過長
                        System.out.print("[轉換為字元串輸出]");
                        cell.setCellType(CellType.STRING);
                        cellValue = cell.toString();
                    }
                    break;
                case ERROR:
                    System.out.print("[資料類型錯誤]");
                    break;
            }
            System.out.println(cellValue);
        }
    }
}      

檢視代碼

2.3.2、XSSF方式導入

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelRead2007Test {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //擷取檔案流
        FileInputStream inputStream = new FileInputStream(PATH + "使用者資訊表2007BigData.xlsx");

        //1.建立工作簿,使用excel能操作的這邊都看看操作
        Workbook workbook = new XSSFWorkbook(inputStream);
        //2.得到表
        Sheet sheet = workbook.getSheetAt(0);
        //3.得到行
        Row row = sheet.getRow(0);
        //4.得到列
        Cell cell = row.getCell(0);
        getValue(cell);
        inputStream.close();
    }


    public static void getValue(Cell cell){
        //比對類型資料
        if (cell != null) {
            CellType cellType = cell.getCellType();
            String cellValue = "";
            switch (cellType) {
                case STRING: //字元串
                    System.out.print("[String類型]");
                    cellValue = cell.getStringCellValue();
                    break;
                case BOOLEAN: //布爾類型
                    System.out.print("[boolean類型]");
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                    break;
                case BLANK: //空
                    System.out.print("[BLANK類型]");
                    break;
                case NUMERIC: //數字(日期、普通數字)
                    System.out.print("[NUMERIC類型]");
                    if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期
                        System.out.print("[日期]");
                        Date date = cell.getDateCellValue();
                        cellValue = new DateTime(date).toString("yyyy-MM-dd");
                    } else {
                        //不是日期格式,防止數字過長
                        System.out.print("[轉換為字元串輸出]");
                        cell.setCellType(CellType.STRING);
                        cellValue = cell.toString();
                    }
                    break;
                case ERROR:
                    System.out.print("[資料類型錯誤]");
                    break;
            }
            System.out.println(cellValue);
        }
    }
}      

檢視代碼

2.3.3、SXSSF方式導入

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class ExcelReadSXSSFTest {

    public static String PATH = "/Users/hello/Desktop/";

    public static void main(String[] args) throws Exception {
        //擷取檔案流

        //1.建立工作簿,使用excel能操作的這邊都看看操作
        OPCPackage opcPackage = OPCPackage.open(PATH + "使用者資訊表2007BigData.xlsx");
        XSSFReader xssfReader = new XSSFReader(opcPackage);
        StylesTable stylesTable = xssfReader.getStylesTable();
        ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage);
        // 建立XMLReader,設定ContentHandler
        XMLReader xmlReader = SAXHelper.newXMLReader();
        xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false));
        // 解析每個Sheet資料
        Iterator<InputStream> sheetsData = xssfReader.getSheetsData();
        while (sheetsData.hasNext()) {
            try (InputStream inputStream = sheetsData.next();) {
                xmlReader.parse(new InputSource(inputStream));
            }
        }
    }

    /**
     * 内容處理器
     */
    public static class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler {

        protected List<String> row;

        /**
         * A row with the (zero based) row number has started
         *
         * @param rowNum
         */
        @Override
        public void startRow(int rowNum) {
            row = new ArrayList<>();
        }

        /**
         * A row with the (zero based) row number has ended
         *
         * @param rowNum
         */
        @Override
        public void endRow(int rowNum) {
            if (row.isEmpty()) {
                return;
            }
            // 處理資料
            System.out.println(row.stream().collect(Collectors.joining("   ")));
        }

        /**
         * A cell, with the given formatted value (may be null),
         * and possibly a comment (may be null), was encountered
         *
         * @param cellReference
         * @param formattedValue
         * @param comment
         */
        @Override
        public void cell(String cellReference, String formattedValue, XSSFComment comment) {
            row.add(formattedValue);
        }

        /**
         * A header or footer has been encountered
         *
         * @param text
         * @param isHeader
         * @param tagName
         */
        @Override
        public void headerFooter(String text, boolean isHeader, String tagName) {
        }
    }

}      

檢視代碼

三、easypoi

以前的以前,有個大佬程式員,跳到一家公司之後就和業務人員聊上了,這些業務員對excel報表有着許許多多的要求,比如想要一個報表,他的表頭是一個多行表頭,過幾天之後,他想要給這些表頭添加樣式,比如關鍵的資料标紅,再過幾天,他想要再末尾添加一條合計的資料,等等!

起初還好,都是copy、copy,之後發現系統中出現大量的重複代碼,于是有一天真的忍受不了了,采用注解搞定來搞定這些定制化成程度高的邏輯,将公共化抽離出來,于是誕生了 easypoi!

easypoi 的底層也是基于 apache poi 進行深度開發的,它主要的特點就是将更多重複的工作,全部簡單化,避免編寫重複的代碼!

下面,我們就一起來了解一下這款高大上的開源工具:easypoi

3.1、首先添加依賴包

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
<dependencies>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-base</artifactId>
        <version>4.1.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-web</artifactId>
        <version>4.1.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-annotation</artifactId>
        <version>4.1.0</version>
    </dependency>
</dependencies>      

檢視代碼

3.2、采用注解導出導入

easypoi 最大的亮點就是基于注解實體類來導出、導入excel,使用起來非常簡單!

首先,我們建立一個實體類UserEntity,其中@Excel注解表示導出檔案的頭部資訊。

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class UserEntity {

    @Excel(name = "姓名")
    private String name;

    @Excel(name = "年齡")
    private int age;

    @Excel(name = "操作時間",format="yyyy-MM-dd HH:mm:ss", width = 20.0)
    private Date time;
 
 //set、get省略
}      

檢視代碼

接着,我們編寫導出服務!

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) throws Exception {
    List<UserEntity> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        UserEntity userEntity = new UserEntity();
        userEntity.setName("張三" + i);
        userEntity.setAge(20 + i);
        userEntity.setTime(new Date(System.currentTimeMillis() + i));
        dataList.add(userEntity);
    }
    //生成excel文檔
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("使用者","使用者資訊"),
            UserEntity.class, dataList);
    FileOutputStream fos = new FileOutputStream("/Users/hello/Documents/easypoi-user1.xls");
    workbook.write(fos);
    fos.close();
}      

檢視代碼

導出的檔案預覽如下:

poi、easypoi和easyexcel的使用

對應的導入操作,也很簡單,源碼如下:

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    ImportParams params = new ImportParams();
    params.setTitleRows(1);
    params.setHeadRows(1);
    long start = new Date().getTime();
    List<StudentEntity> list = ExcelImportUtil.importExcel(new File("/Users/hello/Documents/easypoi-user1.xls"),
            UserEntity.class, params);
    System.out.println(new Date().getTime() - start);
    System.out.println(JSONArray.toJSONString(list));
}      

檢視代碼

運作程式,輸出結果如下:

[{"age":20,"name":"張三0","time":1616919493000},{"age":21,"name":"張三1","time":1616919493000},{"age":22,"name":"張三2","time":1616919493000},{"age":23,"name":"張三3","time":1616919493000},{"age":24,"name":"張三4","time":1616919493000},{"age":25,"name":"張三5","time":1616919493000},{"age":26,"name":"張三6","time":1616919493000},{"age":27,"name":"張三7","time":1616919493000},{"age":28,"name":"張三8","time":1616919493000},{"age":29,"name":"張三9","time":1616919493000}]
           

3.3、自定義資料結構導出導入

easypoi 同樣也支援自定義資料結構導出導入excel。

  • 自定義資料導出 excel
poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) throws Exception {
    //封裝表頭
    List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>();
    entityList.add(new ExcelExportEntity("姓名", "name"));
    entityList.add(new ExcelExportEntity("年齡", "age"));
    ExcelExportEntity entityTime = new ExcelExportEntity("操作時間", "time");
    entityTime.setFormat("yyyy-MM-dd HH:mm:ss");
    entityTime.setWidth(20.0);
    entityList.add(entityTime);
    //封裝資料體
    List<Map<String, Object>> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Map<String, Object> userEntityMap = new HashMap<>();
        userEntityMap.put("name", "張三" + i);
        userEntityMap.put("age", 20 + i);
        userEntityMap.put("time", new Date(System.currentTimeMillis() + i));
        dataList.add(userEntityMap);
    }
    //生成excel文檔
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("學生","使用者資訊"), entityList, dataList);
    FileOutputStream fos = new FileOutputStream("/Users/panzhi/Documents/easypoi-user2.xls");
    workbook.write(fos);
    fos.close();
}      

檢視代碼

  • 導入 excel
poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    ImportParams params = new ImportParams();
    params.setTitleRows(1);
    params.setHeadRows(1);
    long start = new Date().getTime();
    List<Map<String, Object>> list = ExcelImportUtil.importExcel(new File("/Users/panzhi/Documents/easypoi-user2.xls"),
            Map.class, params);
    System.out.println(new Date().getTime() - start);
    System.out.println(JSONArray.toJSONString(list));
}      

檢視代碼

更多的 api 操作可以通路 Easypoi - 接口文檔

四、easyexcel

easyexcel 是阿裡巴巴開源的一款 excel 解析工具,底層邏輯也是基于 apache poi 進行二次開發的。不同的是,再讀寫資料的時候,采用 sax 模式一行一行解析,在并發量很大的情況下,依然能穩定運作!

下面,我們就一起來了解一下這款新起之秀!

4.1、首先添加依賴包

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.6</version>
    </dependency>
 <!--常用工具庫-->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>29.0-jre</version>
    </dependency>
</dependencies>      

檢視代碼

4.2、采用注解導出導入

easyexcel 同樣也支援采用注解方式進行導出、導入!

首先,我們建立一個實體類UserEntity,其中@ExcelProperty注解表示導出檔案的頭部資訊。

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public class UserEntity {

    @ExcelProperty(value = "姓名")
    private String name;

    @ExcelProperty(value = "年齡")
    private int age;

    @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
    @ExcelProperty(value = "操作時間")
    private Date time;
    
    //set、get省略
}      

檢視代碼

接着,我們來編寫導出服務!

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    List<UserEntity> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        UserEntity userEntity = new UserEntity();
        userEntity.setName("張三" + i);
        userEntity.setAge(20 + i);
        userEntity.setTime(new Date(System.currentTimeMillis() + i));
        dataList.add(userEntity);
    }
    EasyExcel.write("/Users/hello/Documents/easyexcel-user1.xls", UserEntity.class).sheet("使用者資訊").doWrite(dataList);
}      

檢視代碼

導出的檔案預覽如下:

poi、easypoi和easyexcel的使用

對應的導入操作,也很簡單,源碼如下:

poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    String filePath = "/Users/hello/Documents/easyexcel-user1.xls";
    List<DemoData> list = EasyExcel.read(filePath).head(UserEntity.class).sheet().doReadSync();
    System.out.println(JSONArray.toJSONString(list));
}      

檢視代碼

運作程式,輸出結果如下:

[{"age":20,"name":"張三0","time":1616920360000},{"age":21,"name":"張三1","time":1616920360000},{"age":22,"name":"張三2","time":1616920360000},{"age":23,"name":"張三3","time":1616920360000},{"age":24,"name":"張三4","time":1616920360000},{"age":25,"name":"張三5","time":1616920360000},{"age":26,"name":"張三6","time":1616920360000},{"age":27,"name":"張三7","time":1616920360000},{"age":28,"name":"張三8","time":1616920360000},{"age":29,"name":"張三9","time":1616920360000}]
           

4.3、自定義資料結構導出導入

easyexcel 同樣也支援自定義資料結構導出導入excel。

  • 自定義資料導出 excel
poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    //表頭
    List<List<String>> headList = new ArrayList<>();
    headList.add(Lists.newArrayList("姓名"));
    headList.add(Lists.newArrayList("年齡"));
    headList.add(Lists.newArrayList("操作時間"));

    //資料體
    List<List<Object>> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        List<Object> data = new ArrayList<>();
        data.add("張三" + i);
        data.add(20 + i);
        data.add(new Date(System.currentTimeMillis() + i));
        dataList.add(data);
    }
    EasyExcel.write("/Users/hello/Documents/easyexcel-user2.xls").head(headList).sheet("使用者資訊").doWrite(dataList);
}      

檢視代碼

  • 導入 excel
poi、easypoi和easyexcel的使用
poi、easypoi和easyexcel的使用
public static void main(String[] args) {
    String filePath = "/Users/panzhi/Documents/easyexcel-user2.xls";
    UserDataListener userDataListener = new UserDataListener();
    EasyExcel.read(filePath, userDataListener).sheet().doRead();
    System.out.println("表頭:" + JSONArray.toJSONString(userDataListener.getHeadList()));
    System.out.println("資料體:" + JSONArray.toJSONString(userDataListener.getDataList()));
}      

檢視代碼

運作程式,輸出結果如下:

表頭:[{0:"姓名",1:"年齡",2:"操作時間"}]
資料體:[{0:"張三0",1:"20",2:"2021-03-28 16:31:39"},{0:"張三1",1:"21",2:"2021-03-28 16:31:39"},{0:"張三2",1:"22",2:"2021-03-28 16:31:39"},{0:"張三3",1:"23",2:"2021-03-28 16:31:39"},{0:"張三4",1:"24",2:"2021-03-28 16:31:39"},{0:"張三5",1:"25",2:"2021-03-28 16:31:39"},{0:"張三6",1:"26",2:"2021-03-28 16:31:39"},{0:"張三7",1:"27",2:"2021-03-28 16:31:39"},{0:"張三8",1:"28",2:"2021-03-28 16:31:39"},{0:"張三9",1:"29",2:"2021-03-28 16:31:39"}]
           

更多的 api 操作可以通路 easyexcel - 接口文檔

五、小結

總體來說,easypoi和easyexcel都是基于apache poi進行二次開發的。

不同點在于:

1、easypoi 在讀寫資料的時候,優先是先将資料寫入記憶體,優點是讀寫性能非常高,但是當資料量很大的時候,會出現oom,當然它也提供了 sax 模式的讀寫方式,需要調用特定的方法實作。

2、easyexcel 基于sax模式進行讀寫資料,不會出現oom情況,程式有過高并發場景的驗證,是以程式運作比較穩定,相對于 easypoi 來說,讀寫性能稍慢!

easypoi 與 easyexcel 還有一點差別在于,easypoi 對定制化的導出支援非常的豐富,如果目前的項目需求,并發量不大、資料量也不大,但是需要導出 excel 的檔案樣式千差萬别,那麼我推薦你用 easypoi;反之,使用 easyexcel !

請尊重原創作者,轉發請注明出處