Excel表格导入数据库进行判断是否有相同的数据

2021-05-05 00:00:00 导入 表格 判断是否

Excel表格导入数据库进行判断是否有相同的数据

这个问题困惑了我1天的时间,终于解决了这个问题。这个问题说复杂也不复杂,说简单也不简单。

我先说一下我的业务需求。
我们大家都知道,数据库对应的实体类一般情况下是数据库的全部字段,往往导入的excel表格数据仅仅是某一些字段属性,这也是复杂点之一。
前端进行选择添加导入和覆盖导入两种情况,我分别设置了type类型分别为0和1,0的话就是添加导入人员,1的话就是覆盖导入人员,把之前的人员删除后重新添加。
其次是要进行判断导入的人员名字不能重复。
首先判断excel表格中的数据name这一列的数据是否重复,如果发现有重复的话就导入失败。
然后是判断excel表格的数据和数据库存在的数据进行对比判断,看看即将导入的人员是否和数据库的人员名字有相同的数据。否则导入失败。
需求就是这样,直接上代码。

依赖

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>2.2.6</version>
 </dependency>

这个是Controller层代码,前端需要用的接口

//获取excel表格的数据转成对象
List<TUser> list = ExcelReaderUtil.readExcel2Bean(in, T t);

这个是封装的工具类

import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ExcelReaderUtil { 
    /** * @methodName: readExcel 读取excel工具类 * @param: [is, tClass] 传入的实体类,成员变量类型只能是基本类型和字符串 * @return: java.util.List<T> * @auther: hwj * @date: 2019/8/9 11:24 * @Description: 读取excel文件,将其转换为javabean */
    public static <T> List<T> readExcel2Bean(InputStream is, Class<T> tClass)
            throws IOException, IllegalAccessException, InstantiationException { 
        List<List<String>> list = ExcelReaderUtil.readExcel(is);
        List<T> listBean = new ArrayList<T>();
        Field[] fields = tClass.getDeclaredFields();

        List<Object> objects = new ArrayList<>();
     
        T uBean = null;
        for (int i = 1; i < list.size(); i++) { // i=1是因为第一行不要
            //System.out.println(list.size());
            uBean = (T) tClass.newInstance();
            List<String> listStr = list.get(i);
            //System.out.println(listStr.size());
            for (int j = 0; j < listStr.size(); j++) { 
                if (j>=objects.size()){ 
                    break;
                }
                Field field = listStr.get(j);
                if (field.name!=null){ 
                    String datastring = listStr.get(j);
                    field.setAccessible(true);
                    if (datastring.length()>0&&datastring!=null) { 
                        Class<?> type = field.getType();
                        // 只支持8中基本类型和String类型 如有其他类型 请自行添加
                        if (type==String.class){ 
                            field.set(uBean,datastring);
                        }else  if(type==Integer.class||type==int.class){ 
                            field.set(uBean,Integer.parseInt(datastring));
                        }else  if(type==Double.class||type==double.class){ 
                            field.set(uBean,Double.parseDouble(datastring));
                        } else  if(type==Float.class||type==float.class){ 
                            field.set(uBean,Float.parseFloat(datastring));
                        } else  if(type==Long.class||type==long.class){ 
                            field.set(uBean,Long.parseLong(datastring));
                        }else if (type==Boolean.class||type==boolean.class){ 
                            field.set(uBean,Boolean.parseBoolean(datastring));
                        }else if (type==Short.class||type==short.class){ 
                            field.set(uBean,Short.parseShort(datastring));
                        }else if (type==Byte.class||type==byte.class){ 
                            field.set(uBean,Byte.parseByte(datastring));
                        }else if (type==Character.class ||type==char.class){ 
                            field.set(uBean,datastring.charAt(0));
                        }
                    }
                }
            }
            listBean.add(uBean);
        }
        return listBean;
    }

    /** * Excel读取 操作,返回内容 */
    private static List<List<String>> readExcel(InputStream is)
            throws IOException { 
        Workbook wb = null;
        try { 
            wb = WorkbookFactory.create(is);
        } catch (FileNotFoundException e) { 
            e.printStackTrace();
        } catch (IOException e) { 
            e.printStackTrace();
        } catch (InvalidFormatException e) { 
            e.printStackTrace();
        }
        /** 得到第一个sheet */
        Sheet sheet = wb.getSheetAt(0);
        /** 得到Excel的行数 */
        int totalRows = sheet.getPhysicalNumberOfRows();
        /** 得到Excel的列数 */
        int totalCells = 0;
        if (totalRows >= 1 && sheet.getRow(0) != null) { 
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        List<List<String>> dataLst = new ArrayList<List<String>>();
        /** 循环Excel的行 */
        for (int r = 0; r < totalRows; r++) { 
            Row row = sheet.getRow(r);
            if (row == null)
                continue;
            List<String> rowLst = new ArrayList<String>();
            /** 循环Excel的列 */
            for (int c = 0; c < totalCells; c++) { 
                Cell cell = row.getCell(c);
                String cellValue = "";
                if (null != cell) { 
                    HSSFDataFormatter hSSFDataFormatter = new HSSFDataFormatter();
                    cellValue = hSSFDataFormatter.formatCellValue(cell);
                }
                //rowLst.add("0");
                rowLst.add(cellValue);
            }
            /** 保存第r行的第c列 */
            dataLst.add(rowLst);
        }
        return dataLst;
    }

}

使用 EasyExcel,我们需要继承 AnalysisEventListener 。

public class UploadEasyExcelListener extends AnalysisEventListener { 
    //可以通过实例获取该值
    private List<Object> datas = new ArrayList<Object>();
    public void invoke(Object o, AnalysisContext analysisContext) { 
        datas.add(o);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
        doSomething(o);//根据自己业务做处理
    }

    private void doSomething(Object object) { 
        //1、入库调用接口
    }

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

    public void setDatas(List<Object> datas) { 
        this.datas = datas;
    }

    public void doAfterAllAnalysed(AnalysisContext analysisContext) { 
        // datas.clear();//解析结束销毁不用的资源
    }
}

这个是完成导入的方法

try { 
    in = serviceFile.getInputStream();
     excelReader = EasyExcel.read(in, TUser.class,
             new UploadEasyExcelListener(tUserService)).build();
     ReadSheet readSheet = EasyExcel.readSheet(0).build();
     excelReader.read(readSheet);
 } catch (IOException ex) { 
     LOGGER.error("导入数据库失败", ex);
     System.out.println("数据库导入失败");
     return new CommonResult().validateFailed("数据库导入失败");
 } finally { 
     close(in);
     // 这里一定别忘记关闭,读的时候会创建临时文件,到时磁盘会崩
     if (excelReader != null) { 
         excelReader.finish();
     }
 }
 System.out.println("添加导入成功");

到此 导入excel数据到数据库已完成!

上面部分代码已罗列出来,入哪个地方不明白的,欢迎前来交流讨论。

###《Excel表格导入数据库进行判断是否有相同的数据》

    原文作者:爱吃肉的羊呐
    原文地址: https://blog.csdn.net/qq_42735982/article/details/119829759
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章