• 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>
  • 相关阅读:
    将博客搬至CSDN
    idea remote debug
    mvn 命令参数
    python pytest之fixture
    pip安装包时出现警告
    python中拼接字符串的两种方法
    python 内置函数eval()
    python中上下文管理,with的用法
    M1下cocoapods pod insstall编译报错 architecture arm64
    Mac OpenSSl is not available的解决方法
  • 原文地址:https://www.cnblogs.com/zhucj-java/p/12017940.html
Copyright © 2020-2023  润新知