java实现批量导入Excel表格数据到数据库
本文是基于Apachepoi类实现的批量导入读取Excel文件,所以要先引入Apachepoi的依赖
org.apache.poi poi 4.1.1 org.apache.poi poi-ooxml 4.1.1
在引入依赖之后,我们就可以开始进行操作了,首先,导入Excel数据,我们要先能够读取Excel每一行每一列的内容,只有读取到内容了,才可以将内容存入数组,最后实现插入数据库。所以我们要先读取Excel表格的数据,我的项目是springboot,我在service定义了一个读取方法,然后在impl里面进行实现,具体代码为
publicclassImportOrderDTO{
privateStringfilePath;
publicStringgetFilePath(){
returnfilePath;
}
publicvoidsetFilePath(StringfilePath){
this.filePath=filePath;
}
}
/**
*读取导入数据excel内容
*
*@paramimportOrderDTO导入参数
*@paramrootPath根路径
*@returnresult
*/
publicstaticfinalStringSEPA=File.separator;//这是下面用到的常量,自己放好位置
privateListreadExcel(ImportOrderDTOimportOrderDTO,StringrootPath){
ListexcelContent=newArrayList<>();
try{
InputStreaminputStream=newFileInputStream(rootPath+SEPA+importOrderDTO.getFilePath());
XSSFWorkbookwb=newXSSFWorkbook(inputStream);
//遍历所有表,只支持xlsx,xls的是H的类
XSSFSheetxssfSheet=wb.getSheetAt(0);
intlastRowNum=xssfSheet.getLastRowNum();
for(inti=0;i<=lastRowNum;i++){
//通过下标获取行
XSSFRowrow=xssfSheet.getRow(i);
//从行中获取数据
if(row.getRowNum()==0){
continue;
}
//第一列为空就跳出
if(row.getCell(0)==null){
continue;
}
/**
*getNumericCellValue()获取数字
*getStringCellValue获取String,设置表格类型为String,可以避免很多问题
*/
row.getCell(0).setCellType(CellType.STRING);
row.getCell(1).setCellType(CellType.STRING);
row.getCell(3).setCellType(CellType.STRING);
row.getCell(5).setCellType(CellType.STRING);
//UserInformPO是我自己定义的数据类,你们导入需要哪些数据就封装哪些,这就不用多讲了吧
UserInformPOuserInformPO=newUserInformPO();
userInformPO.setAccount(row.getCell(0).getStringCellValue());
userInformPO.setIdCard(row.getCell(1).getStringCellValue());
userInformPO.setAvatar(row.getCell(2).getStringCellValue());
userInformPO.setNickname(row.getCell(3).getStringCellValue());
userInformPO.setSex(row.getCell(4).getStringCellValue());
Stringsalt=EncryptUtils.createSalt();
userInformPO.setSalt(salt);
//职业类别
userInformPO.setIntegral(0);
userInformPO.setVipLevel(0);
userInformPO.setIsEnabled(0);
userInformPO.setDelFlag(0);
//然后将po转到我的实体类entity里面并将实体类加入到数组,方便正式执行批量导入的时候可以用,一些没有的类是我自己定义的加密的(规范)
Useruser=newUser();
if(userInformPO.getSex().equals(SexEnum.MAN.getText())){
user.setSex(SexEnum.MAN.getValue());
}else{
user.setSex(SexEnum.WOMAN.getValue());
}
user.setAccount(userInformPO.getAccount());
user.setIdCard(userInformPO.getIdCard());
user.setAvatar(userInformPO.getAvatar());
user.setNickname(userInformPO.getNickname());
user.setPassword(userInformPO.getPassword());
user.setSalt(userInformPO.getSalt());
user.setIntegral(userInformPO.getIntegral());
user.setVipLevel(userInformPO.getVipLevel());
user.setDepartmentId(31);
user.setIsEnabled(userInformPO.getIsEnabled());
user.setDelFlag(userInformPO.getDelFlag());
user.setUpdateTime(newTimestamp(System.currentTimeMillis()));
user.setCreateTime(newTimestamp(System.currentTimeMillis()));
//加入到数组中并且该方法返回该数组
excelContent.add(user);
}
}catch(FileNotFoundExceptione){
thrownewServerException("文件不存在");
}catch(IOExceptione){
System.out.println(e);
thrownewServerException("读取文件失败");
}
returnexcelContent;
}
在上面写完读取Excel表单数据后,就可以开始写插入数据库的方法了,我用的是mybatisplus,方法直接写到下面,大家不会陌生,返回方法是我封装的类,大家用自己项目的稍加修改就可以
publicResultimportUserWithExcel(ImportOrderDTOimportOrderDTO,StringrootPath){
try{
//调用上面的方法,读取前端传过来的参数和文件路径
ListexcelContent=readExcel(importOrderDTO,rootPath);
if(excelContent.isEmpty()){
returnResultUtil.error("数据为空");
}
//下面都是一些逻辑处理,大家一定看得懂就不多说了
ListuserList=userMapper.selectList(newEntityWrapper());
ListsameList=newArrayList<>();
ListdifferentList=newArrayList<>();
for(UserexcelStudent:excelContent){
//数据不同
booleanflag=true;
for(Useruser:userList){
if(user.getAccount().equals(excelStudent.getAccount())){
//相同的数据
flag=false;
sameList.add(excelStudent);
}
}
if(flag){
//如果导入的数据与上面判断的条件相等了,就执行插入操作
differentList.add(excelStudent);
userMapper.insert(excelStudent);
}
}
if(differentList.size()==0){
//判断如果导入的数据跟当前的数据一致的话
returnResultUtil.error("导入数据与当前数据一致!");
}
returnResultUtil.successWithMessage("数据导入成功");
}catch(Exceptione){
System.out.println(e);
returnResultUtil.error("数据导入失败,请检查导入文件格式与模板文件是否相同!");
}
}
service层方法写完了,接着就是controller了,直接上代码,工具类在下面
@PostMapping(value="/importExcel")
publicResultimportExcel(HttpServletRequestrequest,@RequestBodyImportOrderDTOimportOrderDTO){
StringrootPath=ExcelUtils.getRootPath(request);
System.out.println(importOrderDTO.getFilePath());
returnuserService.importUserWithExcel(importOrderDTO,rootPath);
}
这是获取根路径的工具类
publicclassExcelUtils{
/**
*获取上传根路径
*
*@paramrequest请求信息
*@returnstring
*/
publicstaticStringgetRootPath(HttpServletRequestrequest){
returnrequest.getSession().getServletContext().getRealPath(UtilConstant.UPLOAD_PATH);
}
publicstaticWorkbookgetWorkbook(StringexcelType){
try{
returnWorkbookFactory.create(!ExcelTypeEnum.XLS.getVal().equals(excelType));
}catch(IOExceptione){
thrownewServerException("创建excel文件失败",e);
}
}
/**
*创建表
*
*@paramwb目标文件
*@paramsheetName表名
*@paramsheetTitle表头
*@returnsheet
*/
publicstaticSheetcreateSheet(Workbookwb,StringsheetName,String[]sheetTitle){
Sheetsheet=wb.createSheet(sheetName);
Rowrow=sheet.createRow(0);
for(inti=0;i
好了,一个简单的Excel批量导入数据就完成了,感谢支持,大家有什么问题都可以评论留言哦
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。