Java怎么上传Excel文件保存到本地MySQL数据库?
写在前面:
1.实现功能:在浏览器端上传文件保存到数据库
2.工具说明:Java版本1.8;浏览器Chrome;IDE工具 IntelliJ IDEA2017.2.1(强烈建议);MySQL 5.7;调试工具Postman
3.代码重点:Excel中的数据格式要和实体表、数据库中字段格式保持一致
最近实现一个业务功能,用户可以导入表格数据到数据库的,学习了一下,写个笔记立个flag,防止入坑,有几种不同的方案,但本质都是一样利用MultipartFile 这个接口,文件传入入口然后进行数据的读写,实现功能不是很难,下面是各种方案的代码:
方案一:上传Excel在本地先备份再保存到数据库
public void importExcel(MultipartFile file) {
//在本地指定保存的位置这里写代码片
File uploadDir = new File("D:\\fileupload");
//判断该文件夹是否存在,防止重复创建文件
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
//新建一个文件
File tempFile = new File("D:\\fileupload\\" + file.getOriginalFilename() + ".xlsx");
//初始化输入流
InputStream is = null;
Workbook wb = null;
//获取文件名
String fileName = file.getOriginalFilename();
try {
//将上传的文件写入新建的文件中
file.transferTo(tempFile);
//根据新建的文件实例化输入流
is = new FileInputStream(tempFile);
//根据不同的Excel格式实例不同的对象
if(ExcelImportUtils.isExcel2007(fileName)){
wb = new XSSFWorkbook(is);
}else{
wb = new HSSFWorkbook(is);
}
List<ProjectPatent> list = new ArrayList<>();
//获取第一张表
Sheet sheet = wb.getSheetAt(0);
//getLastRowNum获取表格中最后一行,从1行开始,第0行是字段名,不是我们要的数据
for(int i = 1; i < sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
ProjectPatent projectPatent = new ProjectPatent();
//字符串格式:获取第1行第1格(列)的数据
projectPatent.setName(row.getCell(1).getStringCellValue());//专利名称
//日期不能直接获取要转换(注:有getDateCellValue()这个方法,但是我没有获取成功)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String applyDate = row.getCell(5).getStringCellValue();
Date date1 = null;
try {
date1 = sdf.parse(applyDate);
} catch (ParseException e) {
LOG.error("日期保存失败");
return new Result(false, "日期保存失败", e.getMessage());
}
projectPatent.setApplyDate(date1);//申请日
//数字类型:默认是Double
Long phone = (long) row.getCell(14).getNumericCellValue();
list.add(projectPatent);
}
//保存到数据库
for(ProjectPatent projectPatent : list){
projectPatentRepository.save(projectPatent);
}
} catch (IOException e){
LOG.error("数据解析异常");
return new Result(false, "数据解析异常", e.getMessage());
}
}
方案二:上传Excel文件直接保存到数据库
public void importExcel2(MultipartFile file) {
//根据文件名判断文件是2003版本还是2007版本
String fileName = file.getOriginalFilename();
try {
Workbook workbook = null;
if(ExcelImportUtils.isExcel2007(fileName)){
workbook = new XSSFWorkbook(file.getInputStream());
}else{
workbook = new HSSFWorkbook(file.getInputStream());
}
List<ProjectPatent> list = new ArrayList<>();
//获取第一张表
Sheet sheet = wb.getSheetAt(0);
//getLastRowNum获取表格中最后一行,从1行开始,第0行是字段名,不是我们要的数据
for(int i = 1; i < sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
ProjectPatent projectPatent = new ProjectPatent();
//字符串格式:获取第1行第1格(列)的数据
projectPatent.setName(row.getCell(1).getStringCellValue());//专利名称
//日期不能直接获取要转换(注:有getDateCellValue()这个方法,但是我没有获取成功)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String applyDate = row.getCell(5).getStringCellValue();
Date date1 = null;
try {
date1 = sdf.parse(applyDate);
} catch (ParseException e) {
LOG.error("日期保存失败");
return new Result(false, "日期保存失败", e.getMessage());
}
projectPatent.setApplyDate(date1);//申请日
//数字类型:默认是Double
Long phone = (long) row.getCell(14).getNumericCellValue();
list.add(projectPatent);
}
//保存到数据库
for(ProjectPatent projectPatent : list){
projectPatentRepository.save(projectPatent);
}
} catch (IOException e){
LOG.error("数据解析异常");
return new Result(false, "数据解析异常", e.getMessage());
}
}
方案三:上传文件直接保存到数据库(Java8新特性)
public void batchImport(MultipartFile file){
List<ProjectPatent> entities = new ArrayList<>();
//注:XSSFWorkbook是2007的读取格式
try (XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream())) {
Sheet sheet = workbook.getSheetAt(0);
int max = sheet.getLastRowNum() - 1;
entities.addAll(IntStream.range(1, max).mapToObj(i -> {
Row row = sheet.getRow(i);
ProjectPatent projectPatent = new ProjectPatent();
//字符串格式:获取第1行第1格(列)的数据
projectPatent.setName(row.getCell(1).getStringCellValue());//专利名称
//日期不能直接获取要转换(注:有getDateCellValue()这个方法,但是我没有获取成功)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String applyDate = row.getCell(5).getStringCellValue();
Date date1 = null;
try {
date1 = sdf.parse(applyDate);
} catch (ParseException e) {
LOG.error("日期保存失败");
return new Result(false, "日期保存失败", e.getMessage());
}
projectPatent.setApplyDate(date1);//申请日
//数字类型:默认是Double
Long phone = (long) row.getCell(14).getNumericCellValue();
return projectPatent;
}).collect(Collectors.toList()));
//保存到数据库
for(ProjectPatent projectPatent : entities){
projectPatentRepository.save(projectPatent);
}
} catch (Exception e) {
System.out.println("数据解析失败");
e.printStackTrace();
}
}