• EasyExcel导入/导出Excel文件


    EasyExcel导入/导出Excel文件简单写法


    1、导入依赖
    2、创建简单导入、导出demo
    3、创建类 继承AnalysisEventListener(导入Excel监听解析表格数据)
    4、创建类 基于注解 自定义Excel导出模版

    1、导入EasyExcel依赖
            
            
           
                com.alibaba
                easyexcel
                3.0.5
           

    2、创建简单导入、导出demo

    import com.alibaba.excel.EasyExcel;
    import com.google.common.collect.Lists;

    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    /**
     * @ClassName ExcelTest
     * @Descripition easyExcel 导入/导出
     * @Author admin
     * @Date 2023/10/9 13:56
     */
    public class ExcelTest {

        public static void main(String[] args) {

            ExcelTest excelTest = new ExcelTest();

            // easyExcel 导入Excel表格简单 : Demo
            excelTest.excelReadUtil();

            // easyExcel 导出Excel表格简单 : Demo
            excelTest.excelWriteUtil();

        }


        /**
         * easyExcel 导入Excel表格简单 : Demo
         */
        public void excelReadUtil() {

            // Excel文件地址(自定义个excel文件夹)
            String fileName = "D:\\test\\test001\\desktop\\excel_test.xlsx";
            //记录开始读取Excel时间,也是导入程序开始时间
            long startReadTime = System.currentTimeMillis();
            System.out.println("------开始读取Excel的Sheet时间(包括导入数据过程):" + startReadTime + "ms------");
            //读取所有Sheet的数据.每次读完一个Sheet就会调用这个方法
            /*List list = EasyExcel.read(fileName, new CustomListener()).headRowNumber(1).doReadAllSync();
            for (Object o : list) {
                System.out.println(o);
            }*/

            // EasyExcel.read(fileName).doReadAll();
            // 多sheet页读取(所有的sheet页)
            // EasyExcel.read(fileName, new CustomListener()).doReadAll();
            // 读取第一个sheet页
            EasyExcel.read(fileName, new CustomListener()).sheet().doRead();
            long endReadTime = System.currentTimeMillis();
            System.out.println("------结束读取Excel的Sheet时间(包括导入数据过程):" + endReadTime + "ms------");
            System.out.println("------读取Excel的Sheet时间(包括导入数据)共计耗时:" + (endReadTime - startReadTime) + "ms------");

        }

    Excel导入截图:

    控制台输出截图:


        /**
         * easyExcel 导出Excel表格简单 : Demo
         */
        public void excelWriteUtil() {
            //1、创建一个文件对象
            File excelFile = new File("D:\\test\\test001\\desktop\\excel_test1001.xlsx");
            //2、判断文件是否存在,不存在则创建一个Excel文件
            if (!excelFile.exists()) {
                try {
                    excelFile.createNewFile();//创建一个新的文件
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //3、指定需要那个class去写。然后写到第一个sheet,名字为模版,然后文件流会自动关闭
            EasyExcel.write(excelFile, ExcelTemplate.class).sheet("订单模版").doWrite(queryToExcel());
        }


        /**
         * 1、查询数据库获取导出的数据集合
         * 2、集合转换导出模版实体集合:ExcelTemplate
         *
         * @return
         */
        public List queryToExcel() {
            // 1、查询数据库获取导出的数据集合
            // 模拟业务代码,获取数据集
            List orders = Lists.newArrayList();
            for (int i = 0; i < 50; i++) {
                ExcelTemplate template1 = new ExcelTemplate(1000L + i, "订单01" + i, "商品名称" + i, "sk1001" + i, 36L + i, 50L + i, "收件人" + i, "北京科技园" + i);
                orders.add(template1);
            }

            // 2、集合转换导出模版实体集合:ExcelTemplate
            List excels = new ArrayList<>();
            //遍历数据集,导出Excel
            for (int i = 0; i < orders.size(); i++) {
                ExcelTemplate order = orders.get(i);
                ExcelTemplate data = new ExcelTemplate();
                data.setOrderNum(order.getOrderNum());
                data.setOrderName(order.getOrderName());
                data.setGoodsName(order.getGoodsName());
                data.setGoodsNum(order.getGoodsNum());
                data.setPrice(order.getPrice());
                data.setNum(order.getNum());
                data.setUserName(order.getUserName());
                data.setAddress(order.getAddress());
                excels.add(data);
            }
            return excels;
        }

    }

    Excel导出截图:

    3、创建类 继承AnalysisEventListener(导入Excel监听解析表格数据)

    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.excel.read.listener.ReadListener;
    import com.alibaba.fastjson.JSON;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.collections.CollectionUtils;
    import org.assertj.core.util.Lists;

    import java.util.List;
    import java.util.Map;

    /**
     * @ClassName CustomListener
     * @Descripition 导入Excel监听解析表格数据
     * @Author admin
     * @Date 2023/10/9 15:40
     */
    @Slf4j
    public class CustomListener extends AnalysisEventListener {

        // 处理数据: 分批导入阈值
        private static final Long size = 8L;

        // private List> list = Lists.newArrayList();
        private List list = Lists.newArrayList();


        // 每解析一行数据,该方法会被调用一次
        @Override
        public void invoke(Object o, AnalysisContext analysisContext) {
            log.info("Excel每解析一行数据,该方法(invoke)会被调用一次 data : {}", JSON.toJSONString(o));
            // int size = analysisContext.readRowHolder().getCellMap().entrySet().size();
            // System.out.println(size);

            list.add(o);
            if(list.size() >= CustomListener.size){
                for (Object o1 : list) {
                    System.out.println(o1);
                }
                System.out.println("处理数据: 分批导入阈值: " + size);
                System.out.println();
                System.out.println();
                list.clear();
            }
        }


        // 全部解析完成被调用
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            System.out.println("最后剩余数据;不够分割 长度 : " + list.size());
            if(CollectionUtils.isNotEmpty(list)){
                for (Object o : list) {
                    System.out.println(o);
                }
                System.out.println();
                list.clear();
            }
            System.out.println("解析数据完成!!!");
            // System.out.println("解析数据完成!!!");
        }
    }

    4、创建类 基于注解 自定义Excel导出模版

    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.annotation.write.style.*;
    import com.alibaba.excel.enums.poi.BorderStyleEnum;
    import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
    import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.apache.poi.ss.usermodel.FillPatternType;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;

    /**
     * @ClassName ExcelTemplate
     * @Descripition 导出模版
     * @Author admin
     * @Date 2023/10/9 18:14
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @HeadRowHeight(value = 50) // 头部行高
    @ContentRowHeight(value = 25) // 内容行高
    @ColumnWidth(value = 25) // 列宽
    // 头背景设置成红色 IndexedColors.RED.getIndex()
    // @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
    // 头字体设置成20, 字体默认宋体
    @HeadFontStyle(fontName = "仿宋", fontHeightInPoints = 20)
    // 头部边框实线
    @HeadStyle(borderTop = BorderStyleEnum.THICK,
            borderBottom = BorderStyleEnum.THICK,
            borderLeft = BorderStyleEnum.THICK,
            borderRight = BorderStyleEnum.THICK)
    // 内容的背景设置成绿色  IndexedColors.GREEN.getIndex()
    // @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
    // 内容字体设置成20, 字体默认宋体
    @ContentFontStyle(fontName = "楷体", fontHeightInPoints = 20)
    // Excel设置内容字体是否水平居中、边框实线
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER,
            borderTop = BorderStyleEnum.MEDIUM,
            borderBottom = BorderStyleEnum.MEDIUM,
            borderLeft = BorderStyleEnum.DOUBLE,
            borderRight = BorderStyleEnum.DOUBLE)
    public class ExcelTemplate {


        // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
        // @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
        // 字符串的头字体设置成20
        // @HeadFontStyle(fontHeightInPoints = 20)
        // 字符串的内容背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
        // @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
        // 字符串的内容字体设置成20,默认宋体
        // @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
        // 设置是否水平居中
        // @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
        @ExcelProperty("订单编码")
        private Long orderNum;

        @ExcelProperty("订单名称")
        private String orderName;

        @ExcelProperty("商品名称")
        private String goodsName;

        @ExcelProperty("商品编码")
        private String goodsNum;

        @ExcelProperty("价格")
        private Long price;

        @ExcelProperty("数量")
        private Long num;

        @ExcelProperty("用户名称")
        private String userName;

        @ColumnWidth(value = 80) // 列宽
        @ExcelProperty("收货地址")
        private String address;


    }
     

  • 相关阅读:
    ubuntu 安装 gparted
    9.30作业
    unity 之参数类型之引用类型
    [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波
    ArcGIS将两个相同范围但不同比例或位置的矢量数据移动到相同位置
    GitHub项目里的api
    双键网络对讲求助模块
    python经典百题之分数评级
    该从什么角度思考npm、yarn与pnpm的区别
    算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
  • 原文地址:https://blog.csdn.net/java_2017_csdn/article/details/133746980