美文网首页
不封装实体不需要注解使用EasyExcel通用读写excel的方

不封装实体不需要注解使用EasyExcel通用读写excel的方

作者: 和平菌 | 来源:发表于2022-10-11 10:38 被阅读0次

    我们通常在读写excel时需要创建一个实体类,添加一一对应的字段才能实现。

    每次都创建实体都比较麻烦,而且当我们不知道Excel格式时,怎么进行读写呢?有没有一种通用的方法来进行处理?

    下面我们来实现通过对EasyExcel封装不用创建实体一步来实现对Excel的读写。

    1、创建通用的实体来保存我们的表头和数据

    @Data
    public class SheetData {
    
        private List<String> header = new ArrayList<>();
        private List<List<String>> datas = new ArrayList<>();
    
        public List<List<String>> toExcelHeader(){
            List<List<String>> headList = new ArrayList<List<String>>();
            for(String row : header){
                List<String> h = new ArrayList<>();
                h.add(row);
                headList.add(h);
            }
            return headList;
        }
    
    }
    

    2、实现AnalysisEventListener接口来处理我们的表头和每一行的数据

    @Data
    public class ArrayDataListener extends AnalysisEventListener<Map<Integer,String>> {
    
        private SheetData data = new SheetData();
    
        @Override
        public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
            super.invokeHead(headMap, context);
    
    
            for(Integer key : headMap.keySet()){
                ReadCellData cellData = headMap.get(key);
                String value = cellData.getStringValue();
                if(ATool.isEmpty(value)){
                    value = "none";
                }
                data.getHeader().add(value);
            }
        }
    
        @Override
        public void invoke(Map<Integer, String> dataMap, AnalysisContext analysisContext) {
            List<String> line = new ArrayList<>();
            for(Integer key : dataMap.keySet()){
                String value = dataMap.get(key);
                if(ATool.isEmpty(value)){
                    value = "none";
                }
                line.add(value);
            }
    
            data.getDatas().add(line);
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
        }
    }
    

    3、封装工具类直接对SheetData进行读写

    public class ExcelTool {
    
        public static SheetData read(InputStream is, int sheetIndex){
            ArrayDataListener arrayDataListener = new ArrayDataListener();
            EasyExcel.read(is, arrayDataListener).sheet(sheetIndex).doRead();
            return arrayDataListener.getData();
        }
    
        public static SheetData read(String path) throws FileNotFoundException {
            return read(path, 0);
        }
    
        public static SheetData read(String path, int sheetIndex) throws FileNotFoundException {
            FileInputStream fis = null;
            SheetData data = null;
            try{
                fis = new FileInputStream(path);
                data = read(fis, sheetIndex);
            } finally {
                ATool.close(fis);
            }
            return data;
        }
    
        public static void write(String dist, SheetData data){
            write(dist, data, 0);
        }
    
        public static void write(String dist, SheetData data, int sheetIndex){
            ExcelWriterBuilder excelWriter = EasyExcel.write(dist);
            excelWriter.head(data.toExcelHeader());
            excelWriter.sheet(sheetIndex).doWrite(data.getDatas());
        }
    

    4、如何使用

    //读数据
    String path = "D:\\files\\汇总数据.xlsx";
    SheetData data = ExcelTool.read(path);
    
    //写数据
    ExcelTool.write(path, data);
    

    相关文章

      网友评论

          本文标题:不封装实体不需要注解使用EasyExcel通用读写excel的方

          本文链接:https://www.haomeiwen.com/subject/hggaartx.html