JAVA項目實戰-阿里巴巴easyexcel導出導入工具使用


本節將分享給大家,實現Excel表格的導出和導入,簡單好用的插件。

 

package com.sf.vsolution.hb.sfce.util.excel;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.util.CollectionUtils;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @description: 阿里巴巴EasyExcel工具
 * @author: zhucj
 * @date: 2019-11-05 13:22
 */
public class EasyExcelUtils {

    private static final Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class);

    private static Sheet initSheet;

    static {
        initSheet = new Sheet(1, 0);
        initSheet.setSheetName("sheet");
        // 設置自適應寬度
        initSheet.setAutoWidth(Boolean.TRUE);
    }

    /**
     * 導入
     * 少於1000行數據 默認樣式
     * @param filePath 文件絕對路徑
     * @return
     */
    public static List<Object> readLessThan1000Row(String filePath) {
        return readLessThan1000RowBySheet(filePath, null);
    }

    /**
     * 導入
     * 少於1000行數據,帶樣式的
     * @param filePath 文件絕對路徑
     * @param sheet
     * @return
     */
    public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) {
        if (!StringUtils.hasText(filePath)) {
            return null;
        }

        sheet = sheet != null ? sheet : initSheet;

        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            return EasyExcelFactory.read(inputStream, sheet);
        } catch (FileNotFoundException e) {
            logger.error("找不到文件或者文件路徑錯誤", e);
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                logger.error("excel文件讀取失敗,失敗原因:{}", e);
            }
        }
        return null;
    }

    /**
     * 導入
     * 大於1000行數據 默認樣式
     * @param filePath
     * @return
     */
    public static List<Object> readMoreThan1000Row(String filePath) {
        return readMoreThan1000RowBySheet(filePath, null);
    }

    /**
     * 導入
     * 大於1000行數據 自定義樣式
     * @param filePath
     * @param sheet
     * @return
     */
    public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) {
        if (!StringUtils.hasText(filePath)) {
            return null;
        }
        sheet = sheet != null ? sheet : initSheet;

        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            ExcelListener excelListener = new ExcelListener();
            EasyExcelFactory.readBySax(inputStream, sheet, excelListener);
            return excelListener.getDatas();
        } catch (FileNotFoundException e) {
            logger.error("找不到文件或者文件路徑錯誤");
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                logger.error("excel文件讀取失敗,失敗原因:{}", e);
            }
        }
        return null;
    }

    /**
     * 導出單個sheet
     * @param response
     * @param dataList
     * @param sheet
     * @param fileName
     * @throws UnsupportedEncodingException
     */
    public static void writeExcelOneSheet(HttpServletResponse response, List<? extends BaseRowModel> dataList, Sheet sheet, String fileName) {
        if (CollectionUtils.isEmpty(dataList)) {
            throw new RuntimeException("導出的表格數據為空!");
        }
        // 如果sheet為空,則使用默認的
        if (null == sheet) {
            sheet = initSheet;
        }
        try {
            String value = "attachment; filename=" + new String(
                    (fileName + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1");
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-disposition", value);

            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = EasyExcelFactory.getWriter(out, ExcelTypeEnum.XLSX, true);
            // 設置屬性類
            sheet.setClazz(dataList.get(0).getClass());
            writer.write(dataList, sheet);
            writer.finish();
            out.flush();
        } catch (IOException e) {
            logger.error("導出失敗,失敗原因:{}", e);
        }
    }

    /**
     * @Author lockie
     * @Description 導出excel 支持一張表導出多個sheet
     * @Param OutputStream 輸出流
     * Map<String, List>  sheetName和每個sheet的數據
     * ExcelTypeEnum 要導出的excel的類型 有ExcelTypeEnum.xls 和有ExcelTypeEnum.xlsx
     * @Date 上午12:16 2019/1/31
     */
    public static void writeExcelMutilSheet(HttpServletResponse response, Map<String, List<? extends BaseRowModel>> dataList, String fileName) throws UnsupportedEncodingException {
        if (CollectionUtils.isEmpty(dataList)) {
            throw new RuntimeException("導出的表格數據為空!");
        }
        try {
            String value = "attachment; filename=" + new String(
                    (fileName + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1");
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-disposition", value);
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
            // 設置多個sheet
            setMutilSheet(dataList, writer);
            writer.finish();
            out.flush();
        } catch (IOException e) {
            logger.error("導出異常", e);
        }
    }


    /**
     * @Author lockie
     * @Description //setSheet數據
     * @Date 上午12:39 2019/1/31
     */
    private static void setMutilSheet(Map<String, List<? extends BaseRowModel>> dataList, ExcelWriter writer) {
        int sheetNum = 1;
        for (Map.Entry<String, List<? extends BaseRowModel>> stringListEntry : dataList.entrySet()) {
            Sheet sheet = new Sheet(sheetNum, 0, stringListEntry.getValue().get(0).getClass());
            sheet.setSheetName(stringListEntry.getKey());
            writer.write(stringListEntry.getValue(), sheet);
            sheetNum++;
        }
    }


    /**
     * 導出監聽
     */
    @Data
    public static class ExcelListener extends AnalysisEventListener {
        private List<Object> datas = new ArrayList<>();

        /**
         * 逐行解析
         * @param object 當前行的數據
         * @param analysisContext
         */
        @Override
        public void invoke(Object object, AnalysisContext analysisContext) {
            if (object != null) {
                datas.add(object);
            }
        }


        /**
         * 解析完所有數據后會調用該方法
         * @param analysisContext
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        }
    }

}

 

package com.sf.detectprocess.controller.param.export;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import com.sf.detectprocess.core.constant.SystemConstants;
import lombok.*;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @description: 導出訂單信息
 * @author: zhucj
 * @date: 2019-11-05 15:48
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ExportComeInsureInfo extends BaseRowModel {


    @ExcelProperty(value = "訂單號",index = 0)
    private String orderNo;

    @ExcelProperty(value = "訂單生成時間",index = 1,format = SystemConstants.DEFAULT_DATETIME_FORMAT)
    private Date createTime;

    @ExcelProperty(value = "起運日期",index = 2)
    private String comeTime;

    @ExcelProperty(value = "物品名稱",index = 3)
    private String goodsInfo;

    @ExcelProperty(value = "包裝件數",index = 4)
    private Integer countPack;

    @ExcelProperty(value = "起點",index = 5)
    private String comeSendAddress;

    @ExcelProperty(value = "終點",index = 6)
    private String comeConsignAddress;

    @ExcelProperty(value = "單號",index = 7)
    private String waybillNo;

    @ExcelProperty(value = "聲明價值",index = 8)
    private BigDecimal sumInsureValue;

}
        <!--alibaba導出 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>1.1.2-beta5</version>
        </dependency>

 

 

 


免責聲明!

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



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