1.先创建要读取Excel的对象类。

①继承BaseRowModel

②每个字段上面添加@ExcelProperty , index是列的索引值,value是列名。

注意:如果只添加index不添加value,可以运行。如果只添加value,不添加index不能运行。

@Data
@ToString
@Slf4j
public class TianMaWarehouseOrderInfo extends BaseRowModel {
    @ExcelProperty(value = "订单ID",index = 0)
    private String orderId;
    @ExcelProperty(value = "配货ID",index = 1)
    private String pickId;
    @ExcelProperty(value = "配货仓",index = 2)
    private String pickWareHouse;
    @ExcelProperty(value = "货号",index = 3)
    private String articleNo;
}

2.封装 解析监听类 (也可以不封装,直接继承AnalysisEventListener 方法)。

public abstract class BaseExcelListener<T> extends AnalysisEventListener {
    private List<T> datas = new ArrayList<T>();

    public List<T> getDatas() {
        return datas;
    }

    public void setDatas(List<T> datas) {
        this.datas = datas;
    }
    /**
     * 在添加到List集合之前(数据过滤,格式转换等)
     * @param object 一行数据
     */
    abstract boolean addListBefore(T object);

    /**
     * 在添加到List集合之后(添加数据库,缓存等)
     * @param object 一行数据
     */
    abstract void doListAfter(T object);

    /**
     * 执行类
     * @param o 一行数据
     * @param analysisContext ~
     */
    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        T t = (T)o;
        boolean flag= addListBefore(t);
        //满足条件的数据, 数据存储到list,供批量处理。 
        if(flag){
            datas.add(t);
            doListAfter(t);
        }
    }

    /**
     * 最后。做一些资源销毁
     * @param analysisContext ~
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

3.继承封装好的监听类,

@Log
public class LocalWareExcelListener<T> extends BaseExcelListener<T> {
    @Override
    boolean addListBefore(T object) {
        log.info("添加数据之前的操作~如果想过滤某条数据,在满足某个条件下,返回false");
        return true;
    }

    @Override
    void doListAfter(T object) {
        log.info("添加数据之后的操作~");
    }
}

4. Utils工具类

@Slf4j
public class ExcelUtils {
    /**
     *
     * @param is            输入文件的流对象
     * @param clazz         每行数据转换成的对象类
     * @param sheetNo       第几个sheet
     * @param excelListener excel的监听类
     * @return              是否成功,如果成功可以再监听类里面取数据
     */
    public static Boolean readExcel(InputStream is, Class<? extends BaseRowModel> clazz,int sheetNo,AnalysisEventListener excelListener){
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(is);
            // 解析每行结果在listener中处理
            ExcelReader excelReader = EasyExcelFactory.getReader(bis, excelListener);
            excelReader.read(new Sheet(sheetNo, 1, clazz));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

    /**
     *
     * @param os 文件输出流
     * @param clazz Excel实体映射类
     * @param data 导出数据
     * @return
     */
    public static Boolean writeExcel(OutputStream os, Class<? extends BaseRowModel> clazz, List<? extends BaseRowModel> data,int seetNo){
        BufferedOutputStream bos= null;
        try {
            bos = new BufferedOutputStream(os);
            ExcelWriter writer = new ExcelWriter(bos, ExcelTypeEnum.XLSX);
            //写第一个sheet, sheet1  数据全是List<String> 无模型映射关系
            Sheet sheet1 = new Sheet(seetNo, 0,clazz);
            writer.write(data, sheet1);
            writer.finish();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
}

5.测试

public static void main(String[] args) {
       //1.读取Excel
       FileInputStream fis = null;
       try {
           fis = new FileInputStream("D:\\1.xlsx");
           LocalWareExcelListener<LocalWareDTO> localWareExcelListener = new LocalWareExcelListener<>();
           Boolean flag = ExcelUtils.readExcel(fis, LocalWareDTO.class,2,localWareExcelListener);
           List<LocalWareDTO> datas = localWareExcelListener.getDatas();
           if(flag){
               log.info("解析数据行数为:{}",datas.size());
           }
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } finally {
           if (fis != null) {
               try {
                   fis.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }

      //2.写入Excel
       FileOutputStream fos = null;
       try {
           fos = new FileOutputStream("D:\\export.xlsx");
           //FileOutputStream fos, Class clazz, List<? extends BaseRowModel> data
           List<LocalWareDTO> list = new ArrayList<>();
           for (int i = 0; i < 5; i++){
               LocalWareDTO excelEntity = new LocalWareDTO();
               excelEntity.setArticleNo("qqwqq123");
               excelEntity.setExpressNo("12321234223");
               excelEntity.setInventoryAmount("234234223");
               excelEntity.setMyjoId("1232123424233");
               list.add(excelEntity);
           }
           Boolean flag = ExcelUtils.writeExcel(fos,LocalWareDTO.class,list,1);
           System.out.println("导出是否成功:"+flag);
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       }finally {
           if (fos != null){
               try {
                   fos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
   }

 

GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io` 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐