EasyExcelアリオープンソースexcelインポートエクスポート

6026 ワード

一、なぜeasyexcelを使うのか
Java解析、Excel生成で有名なフレームワークはApache poi、jxlです.しかし、彼らには深刻な問題があります.非常にメモリを消費しています.poiにはSAXモードのAPIがあり、メモリオーバーフローの問題をある程度解決することができますが、POIにはいくつかの欠陥があります.例えば、07版Excelの解凍や解凍後のストレージはメモリの中で完成しており、メモリの消費は依然として大きいです.easyexcelはpoiの07版Excelに対する解析を書き換え、本来1つの3 Mのexcel用POI saxは依然として100 M程度のメモリをKBレベルに下げる必要があり、さらに大きなexcelではメモリオーバーフローは発生せず、03版ではPOIに依存するsaxモードである.上層部にモデル変換のパッケージを作り,利用者をより簡単に便利にした.
二、依存

    com.alibaba
    easyexcel
    {latestVersion}


三、簡単に使う
1.ExcelUtilツールクラスは、そのツールクラスを直接呼び出す方法でExcelの読み取りまたは書き込みを完了することができます.ExcelListenerリスニングクラスは、必要に応じて自分の状況に応じて、取得したデータをカスタマイズして処理することができます.ここでは簡単にリストにデータを追加するだけです.
public class ExcelListener extends AnalysisEventListener {

    //         data。
    //          
    private List datas = new ArrayList<>();

    /**
     *    AnalysisContext           sheet,      
     */
    @Override
    public void invoke(Object object, AnalysisContext context) {
        //     list,     ,           。
        datas.add(object);
        //         
        doSomething(object);
    }

    private void doSomething(Object object) {
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        /*
            datas.clear();
                       
         */
    }

    public List getDatas() {
        return datas;
    }

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

3.ExcelWriterFactroy複数のsheetをエクスポートするためのExcelで、複数のsheetを複数のwriteメソッドで書き込む
4.ExcelException関連Exceptionの取得
Excelの読み込み
Excelを読み込むときはExcelUtilを呼び出すだけです.readExcel()メソッド
@RequestMapping(value = "readExcel", method = RequestMethod.POST)
public Object readExcel(MultipartFile excel) {
    return ExcelUtil.readExcel(excel, new ImportInfo());
}
   excel   MultipartFile        ,  new ImportInfo()    Excel         ,     BaseRowModel  , :

public class ImportInfo extends BaseRowModel {
    @ExcelProperty(index = 0)
    private String name;

    @ExcelProperty(index = 1)
    private String age;

    @ExcelProperty(index = 2)
    private String email;

    /*
           excel      ,   setter   
     */
    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

マッピングエンティティクラスとして、@ExcelProperty注記とindex変数を使用すると、メンバー変数にマッピングされた列を表示できます.setterメソッドは欠かせません.
Excel 1をエクスポートします.エクスポートされたExcelは1つのsheetしか持っていません.ExcelUtilを呼び出すだけです.writeExcelWithSheets()メソッド:
@RequestMapping(value = "writeExcel", method = RequestMethod.GET)
public void writeExcel(HttpServletResponse response) throws IOException {
    List list = getList();
    String fileName = "   Excel   ";
    String sheetName = "    sheet";

    ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo());
    }

file Name、sheetNameはそれぞれエクスポートファイルのファイル名とsheet名、new ExportInfo()はエクスポートデータのマッピングエンティティオブジェクト、listはエクスポートデータです.
マッピングされたエンティティークラスについては、必要に応じて@ExcelProperty注釈でヘッダーをカスタマイズできます.もちろん、BaseRowModelクラスも継承する必要があります.たとえば、次のようにします.
public class ExportInfo extends BaseRowModel {
    @ExcelProperty(value = "  " ,index = 0)
    private String name;

    @ExcelProperty(value = "  ",index = 1)
    private String age;

    @ExcelProperty(value = "  ",index = 2)
    private String email;

    @ExcelProperty(value = "  ",index = 3)
    private String address;
}

valueはカラム名、indexはカラムのシーケンス番号
複雑な点が必要な場合は、次の図のような効果が得られます.
対応するエンティティ・クラスの書き方は次のとおりです.
public class MultiLineHeadExcelModel extends BaseRowModel {

    @ExcelProperty(value = {"  1","  1","  31"},index = 0)
    private String p1;

    @ExcelProperty(value = {"  1","  1","  32"},index = 1)
    private String p2;

    @ExcelProperty(value = {"  3","  3","  3"},index = 2)
    private int p3;

    @ExcelProperty(value = {"  4","  4","  4"},index = 3)
    private long p4;

    @ExcelProperty(value = {"  5","  51","  52"},index = 4)
    private String p5;

    @ExcelProperty(value = {"  6","  61","  611"},index = 5)
    private String p6;

    @ExcelProperty(value = {"  6","  61","  612"},index = 6)
    private String p7;

    @ExcelProperty(value = {"  6","  62","  621"},index = 7)
    private String p8;

    @ExcelProperty(value = {"  6","  62","  622"},index = 8)
    private String p9;
}

2.エクスポートされたExcelは複数のsheet呼び出しExcelUtilを持つ.writeExcelWithSheets()は最初のsheetを処理し、その後write()メソッドを呼び出して順次処理した後のsheetを呼び出し、最後にfinish()メソッドを使用して終了する
public void writeExcelWithSheets(HttpServletResponse response) throws IOException {
    List list = getList();
    String fileName = "   Excel   ";
    String sheetName1 = "    sheet";
    String sheetName2 = "    sheet";
    String sheetName3 = "    sheet";

    ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo())
                .write(list, sheetName2, new ExportInfo())
                .write(list, sheetName3, new ExportInfo())
                .finish();
}

writeメソッドのパラメータは、現在のsheetのlistデータ、現在のsheet名、および対応するマッピングクラスです.
注意:新しいバージョンでは、このExcelUtilというクラスは見られませんでしたが、ExcelReaderクラスとExcelWriterクラスがあります.性能が本当に向上したと言わざるを得ませんが、コードを書くのは簡単です.ここでメモを取って、みんなで勉強してみましょう.