不封裝實體不需要注解使用EasyExcel通用讀寫excel的方式

我們通常在讀寫excel時需要創(chuàng)建一個實體類,添加一一對應的字段才能實現(xiàn)。

每次都創(chuàng)建實體都比較麻煩,而且當我們不知道Excel格式時,怎么進行讀寫呢?有沒有一種通用的方法來進行處理?

下面我們來實現(xiàn)通過對EasyExcel封裝不用創(chuàng)建實體一步來實現(xiàn)對Excel的讀寫。

1、創(chuàng)建通用的實體來保存我們的表頭和數(shù)據(jù)

@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、實現(xiàn)AnalysisEventListener接口來處理我們的表頭和每一行的數(shù)據(jù)

@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、如何使用

//讀數(shù)據(jù)
String path = "D:\\files\\匯總數(shù)據(jù).xlsx";
SheetData data = ExcelTool.read(path);

//寫數(shù)據(jù)
ExcelTool.write(path, data);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容