Excel怎么导入到数据库?

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();
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值