利用 EasyExcel 進行Excel讀寫


簡介

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

准備

引入maven

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.0.5</version>
    </dependency>

開始使用

1、創建Excel對應的實體類對象,DemoData

public class DemoData implements Serializable{
    /**
     * @ExcelProperty({"主標題","編碼"})
     * 可以通過 @ExcelProperty 實現多行表頭的讀寫(如:主標題為一級表頭,編碼為二級表頭)
     */
    @ExcelProperty({"編碼"})
    private Integer id;
    @ExcelProperty({ "手機號"})
    private String phone;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2、創建讀取Excel的回調監聽器,DemoDataListener

public class DemoDataListener extends AnalysisEventListener<DemoData> {

    /**
     * 每隔5條存儲數據庫,然后清理list,方便內存回收
     */
    private static final int BATCH_COUNT = 5;

    List<DemoData> list = new ArrayList<DemoData>();

    /**
     * 自定義service,也可以是dao,處理讀取到的excel數據
     */
    private DemoDataService demoDataService;

    // 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
    public DemoDataListener(DemoDataService demoDataService){
        this.demoDataService = demoDataService;
    }

    // 這個每一條數據解析都會來調用
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        list.add(demoData);
        // 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條放在內存,容易oom
        if(list.size() >= BATCH_COUNT){
            saveData();
            list.clear();
        }
    }

    // 存儲到數據庫
    private void saveData(){
        log.info("{}條數據,開始存儲數據庫",list.size());
        demoDataService.save(list);
        log.info("存儲數據成功");
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //這里也要保存數據,確保最后遺留的數據也存儲到數據庫
        saveData();
        log.info("所有數據解析完成");
    }
}

讀Excel-單個sheet

    /**
     * 1、創建Excel對應的實體類對象,DemoData
     * 2、創建讀取Excel的回調監聽器,DemoDataListener
     */
    public void read(){
        String fileName = filePath + "demo.xlsx";//文件路徑
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener(demoDataService)).sheet().doRead();
    }

讀Excel-多個sheet

    /**
     * 1、創建Excel對應的實體類對象,DemoData
     * 2、創建讀取Excel的回調監聽器,DemoDataListener
     */
    public void repeatRaad(){
        String fileName = filePath + "demo.xlsx";//文件路徑

        // 讀取部分sheet
        ExcelReader excelReader = null;
        try {
            excelReader = EasyExcel.read(fileName).build();

            ReadSheet readSheet1 =
                    EasyExcel.readSheet(0).head(DemoData.class)
                            .registerReadListener(new DemoDataListener(demoDataService)).build();
            ReadSheet readSheet2 =
                    EasyExcel.readSheet(1).head(DemoData.class)
                            .registerReadListener(new DemoDataListener(demoDataService)).build();
            excelReader.read(readSheet1, readSheet2);
        }finally {
            if (excelReader != null){
                excelReader.finish();
            }
        }
    }

寫Excel

    public void write(){
        String fileName = filePath + "demo.xlsx";//文件路徑
        List<DemoData> list = demoDataService.select();
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);
    }

從數據庫導出Excel,文件下載

    public void download(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        String fileName = URLEncoder.encode("demo", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        List<DemoData> list = demoDataService.select();
        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
    }

最后

通過 EaseExcel 可以優雅的對Excel進行讀寫操作,方便快捷,簡單好用。本文只是介紹了最簡單的讀寫方法,詳情使用方法請參考EasyExcel使用說明, github地址:https://github.com/alibaba/easyexcel


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM