1. 程式人生 > >java百萬級別excel匯出(easyExcel)

java百萬級別excel匯出(easyExcel)

1.為什麼需要excel到處?

匯出功能在各個領域都被廣泛的運用,當用戶想把資料下載下來的時候,此時excel是一個不錯的選擇。

2.如何選擇合適的excel匯出?

選擇的問題一般都比較糾結,選擇了一個版本之後發現另外一個版本更適合,所以我們就應該選擇一些我們相對較熟悉或者符合自己開發習慣的就行,沒有必要糾結到底選擇那個版本。

3.easyexcel工具

Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗記憶體,poi有一套SAX模式的API可以一定程度的解決一些記憶體溢位的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後儲存都是在記憶體中完成的,記憶體消耗依然很大。easyexcel重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右記憶體降低到KB級別,並且再大的excel不會出現記憶體溢位,03版依賴POI的sax模式。在上層做了模型轉換的封裝,讓使用者更加簡單方便(此處引用gitHub)

好了,廢話不多說,直接進入主題,如何運用easyExcel進行excel到處。

第一:引入jar包.

gradle:

compile("com.alibaba:easyexcel:1.0.4")

maven:

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

核心程式碼:ExcelUtils.java

package com.dctp.cloud.boss.util;

import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.dctp.cloud.bo.BoUtil;
import com.dctp.cloud.boss.bo.OTCTradeBo;
import org.apache.poi.ss.formula.functions.T;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**

* @Description:    excel操作工具類

* @Author:         yaomaoyang

* @CreateDate:     2018/9/29 18:05

* @UpdateUser:     yaomaoyang

* @UpdateDate:     2018/9/29 18:05

* @UpdateRemark:   修改內容

* @Version:        1.0

*/
public class ExcelUtils {
    /**
     * 匯出
     * @param list
     * @param response
     * @param clazz
     * @return
     */
    public static  BoUtil export(List<? extends BaseRowModel> list, HttpServletResponse response, Class<? extends BaseRowModel> clazz) {

        BoUtil boUtil = BoUtil.getDefaultFalseBo();
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
        try {
            boUtil = BoUtil.getDefaultTrueBo();
            String fileName = new String(
                    (new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), "UTF-8");
            Sheet sheet2 = new Sheet(2, 3,clazz, "sheet", null);
            writer.write(list, sheet2);
            //response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
            //response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            out.flush();
            boUtil.setMsg("匯出成功");
        } catch (Exception e) {
            e.printStackTrace();
            boUtil.setMsg("匯出失敗");
            return boUtil;
        } finally {
            writer.finish();
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return boUtil;
        }
    }
}

 AdvertisingIndentBo.java

package com.dctp.cloud.boss.bo;

import java.math.BigDecimal;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Builder;

@SuppressWarnings("deprecation")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AdvertisingIndentBo extends BaseRowModel {
   // 訂單編號
   @ExcelProperty(value = {"廣告編號"},index = 0)
   private String id;
   // 交易型別:1 買入 2賣出
   private Integer tradeType;
   @ExcelProperty(value = {"交易"},index = 1)
   //交易型別(匯出時使用)
   private String tradeTypeStr;
   // 使用者ID begin
   private Long userID;
   private Integer login;
   private String alaisName;
   @ExcelProperty(value = {"會員"},index = 2)
   private String realname;
   private String phone;
   private String email;
   // 使用者資訊 end

   // 資產ID
   private Long coinID;
   @ExcelProperty(value = {"資產名稱"},index = 3)
   private String coinName;
   // 交易狀態
   private Integer tradeState;
   //交易狀態(匯出時使用)
   @ExcelProperty(value = {"狀態"},index = 4)
   private String tradeStateStr;
   // 取價型別
   private Integer priceType;
   // 取價型別(匯出時使用)
   @ExcelProperty(value = {"取價型別"},index = 5)
   private String priceTypeStr;
   // 平臺實時價格的百分比
   @ExcelProperty(value = {"溢價"},index = 6)
   private BigDecimal premium;
   // 交易單價
   @ExcelProperty(value = {"價格"},index = 7)
   private BigDecimal price;
   // 交易數量
   private BigDecimal cionNum;
   // 剩餘數量
   private BigDecimal residueNum;
   // 交易最小金額
   @ExcelProperty(value = {"最小金額"},index = 8)
   private BigDecimal minPrice;
   // 交易最大金額
   @ExcelProperty(value = {"最大金額"},index = 9)
   private BigDecimal maxPrice;
   // 付款方式型別
   @ExcelProperty(value = {"付款型別"},index = 10)
   private String payType;
   // 付款期限30-120分鐘之內
   @ExcelProperty(value = {"付款期限"},index = 11)
   private Integer payTime;
   // 建立時間
   @ExcelProperty(value = {"建立時間"},index = 12)
   private String createTime;
   // 交易密碼
   private String password;
   /**
    * 建立人
    */
   private Long createBy;
   /**
    * 修改人
    */
   private Long updateBy;
   private String activeFlag;
}
controller:

boUtil = ExcelUtils.export(list, response, AdvertisingIndentBo.class);

list:LIst<AdvertisingIndentBo>:你需要到處的資料集合。

BaseRowModel:為什麼要繼承BaseRowModel,因為他是基類。

@ExcelProperty:對應excel中的表頭。

    value:表頭的名稱

   index:排序

總結

以上就是esatExcel的excel到處,如果有什麼疑問或者不足,歡迎大家的留言。