Excel表格导入数据库进行判断是否有相同的数据
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数据到数据库已完成!
上面部分代码已罗列出来,入哪个地方不明白的,欢迎前来交流讨论。
###
原文作者:爱吃肉的羊呐
原文地址: https://blog.csdn.net/qq_42735982/article/details/119829759
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_42735982/article/details/119829759
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章