Java+EasyExcel实现文件上传功能

 更新时间:2023年02月24日 14:33:55   作者:糊涂涂是个小盆友  
这篇文章主要为大家详细介绍了如何通过Java和EasyExcel实现文件上传功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

需求描述

页面中当用户将excel表格上传到服务器后,将该excel文件保存在本地然后在服务器中将excel中的数据读取出来然后存入数据库

实现

0、依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>
 <!-- 糊涂工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>

1、编写配置类

文件上传的路径:用户传来的文件存放在哪

  # 文件上传
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 50MB

​​​​​​​## 文件上传路径
savepath: C:\Users\86186\Desktop\pp

2、文件上传工具类

文件上传时需要使用到的一些方法

/**
 * 文件上传的工具类
 */
public class FileUploadUtil {
    /**
     * 得到filename文件名的后缀名
     * @param filename  文件名
     *                 aasdsad.jpg asaa.gif
     * @return
     */
    public static String getFileSuffix(String filename){
        if(filename == null || filename.isEmpty()){
            throw new RuntimeException("文件名不能为空,filename:"+filename);
        }
        return filename.substring(filename.lastIndexOf("."));
    }

    /**
     * 使用UUID生成一个唯一的字符串
     * @return
     */
    public static String randomFilename(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }

    /**
     * 基于时间戳生成文件名
     * @return
     */
    public static String randomFilename2(){
        return System.currentTimeMillis()+"";
    }
    /**
     * 基于时间戳 + UUID生成文件名
     * @return
     */
    public static String randomFilename3(){
        return System.currentTimeMillis()+randomFilename();
    }


    /**
     * 创建目录
     */
    public static void mkdir(String path){
        File file = new  File(path);
        if(!file.exists()){ //不存在
            file.mkdirs();
        }
    }

    /**
     * 基于当前时间创建文件名
     */
    public static String getTimeFilename(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd-HH-mm-ss");
        Date date = new Date(System.currentTimeMillis());
        return simpleDateFormat.format(date)+"-"+randomFilename2();
    }
}

3、编写Controller

需要接受前端返回回来的文件

/**
    * excel文件导入进数据库中
    * @param file
    * @return
    */
   @Autowired
   private FileUploadService fileUploadService;

   @PostMapping("excelImport")
   public ResponseData excelImport(MultipartFile file) throws Exception {
   		// 由于easyExcel所以需要传入fileUploadService对象
       String upload = fileUploadService.upload(file,fileUploadService);
       return ResponseDataUtil.buildOk(upload);
   }

4、编写Service

@Service("fileUploadService")
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {
	// 注入environment来获取在配置文件中文件保存的路径
    @Autowired
    private Environment environment;
    // 注入数据层的对象
    @Autowired
    private productMapper productMapper;

    @Override
    public String upload(MultipartFile file, FileUploadService fileUploadService) throws Exception {
        if (file == null) {
            throw new Exception("文件不可以为空");
        }
        //得到上传的保存路径
        String savePath = environment.getProperty("savepath");
        //创建目录
        FileUploadUtil.mkdir(savePath);
        String dbPath = "";

        //得到上传的原文件名
        String originalFilename = file.getOriginalFilename();
        String suffix = FileUploadUtil.getFileSuffix(originalFilename);
        String filename = FileUploadUtil.getTimeFilename() + suffix;
        dbPath += filename;
        //保存
        file.transferTo(new File(savePath, filename));
        dbPath = savePath +"\\"+ dbPath;

        //调用方法进行读取
        EasyExcel.read(dbPath, ExcelDTO.class, new PageReadListener<ExcelDTO>(dataList -> {
            for (ExcelDTO demoData : dataList) {
                log.info("读取到一条数据{}", JSON.toJSONString(demoData));
                insert(demoData);
            }
        })).sheet().doRead();

        return dbPath;
    }

	// 插入数据到数据库中
    @Override
    public void insert(ExcelDTO excelDTO) {
    	// 使用hutool工具类将excelDTO类转换成product类,因为product类对应的是数据库中的字段
        Product product = BeanUtil.copyProperties(excelDTO, Product.class);
        productMapper.insert(product);
    }

}

5、编写excel对应的类

@Data
public class ExcelDTO {
   @ExcelProperty("药品名称")
   private String pname;
   @ExcelProperty("药品价格")
   private BigDecimal pprice;
   @ExcelProperty("药品数量")
   private String pcount;
   @ExcelProperty("药品描述")
   private String pdes;
   @ExcelProperty("药品类别")
   private Integer ptype;
}

6、创建easyExcel的监听器

ExcelDTO = excel对应的类

fileUploadService = service对象

@Slf4j
@Component
public class DataListener extends AnalysisEventListener<ExcelDTO> {

    public FileUploadService fileUploadService;

    public  DataListener(FileUploadService fileUploadService) {
        this.fileUploadService = fileUploadService;
    }

    public  DataListener() {
    }

    //读取excel内容,一行一行读取
    @Override
    public void invoke(ExcelDTO excelDTO, AnalysisContext analysisContext) {
        if (excelDTO == null) {
            try {
                throw new Exception("文件数据为空");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

7、最终效果

以上就是Java+EasyExcel实现文件上传功能的详细内容,更多关于Java EasyExcel文件上传的资料请关注脚本之家其它相关文章!

相关文章

  • Android中Parcelable的作用实例解析

    Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下
    2014-08-08
  • 详解SpringBoot结合策略模式实战套路

    详解SpringBoot结合策略模式实战套路

    这篇文章主要介绍了详解SpringBoot结合策略模式实战套路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Jenkins迁移job插件Job Import Plugin流程详解

    Jenkins迁移job插件Job Import Plugin流程详解

    这篇文章主要介绍了Jenkins迁移job插件Job Import Plugin流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • IDEA强制清除Maven缓存的实现示例

    IDEA强制清除Maven缓存的实现示例

    清除项目缓存是一个常见的操作,本文主要介绍了IDEA强制清除Maven缓存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 微信公众号支付(一)如何获取用户openId

    微信公众号支付(一)如何获取用户openId

    本篇文章给大家介绍微信公众号支付如何获取用户openid,需要授权回调页面域名等一系列途径实现此功能,需要的朋友可以参考下
    2015-09-09
  • Java中使用HashMap时指定初始化容量性能解析

    Java中使用HashMap时指定初始化容量性能解析

    这篇文章主要为大家介绍了Java中使用HashMap时指定初始化容量性能解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java实现分解任意输入数的质因数算法示例

    Java实现分解任意输入数的质因数算法示例

    这篇文章主要介绍了Java实现分解任意输入数的质因数算法,涉及java数学运算相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • 使用SpringMVC响应json格式返回的结果类型

    使用SpringMVC响应json格式返回的结果类型

    这篇文章主要介绍了使用SpringMVC响应json格式返回的结果类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java实现在线SQL编程最新完整版

    Java实现在线SQL编程最新完整版

    这篇文章主要介绍了Java实现在线SQL编程,在使用JDBC来进行数据库的操作,在使用时由于对其方法并不是全部了解,所以需要边看源码边改善功能,感兴趣的朋友跟随小编一起看看吧
    2022-06-06
  • SpringCloudAlibaba Nacos开启鉴权解决跳过登录页面问题

    SpringCloudAlibaba Nacos开启鉴权解决跳过登录页面问题

    对于Nacos,如果需要开启权限控制,可以在 Nacos 控制台上进行配置,本文主要介绍了SpringCloudAlibaba Nacos开启鉴权解决跳过登录页面问题,感兴趣的可以了解一下
    2023-10-10

最新评论