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

2022-10-11  本文已影响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);
上一篇下一篇

猜你喜欢

热点阅读