SpringBoot+easypoi实现excel的导入导出

2022-10-17 08:35:28

关于数据库中数据以excel表格进行导入和导出的需求是十分常见的,本篇博客是使用easypoi来实现的。借助的是之前有关springboot+mybatis-plus搭建的一个小项目。

1.准备阶段。

  • 准备好数据库,可以建一张简单的基础的用户信息表原来测试。
  • 新建springboot项目,并且可以使用mybatis-plus快速生成对应的代码,这里有关其使用可以看我的这篇博客:SpringBoot+Mybati-Plus实现代码快速搭建
  • 除了之前项目中已经有的依赖,还需要导入easypoi的依赖,这里我之前参照网上发现一个坑,需要引入hibernate-validator这个依赖,不然后续导入操作会报错:
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version></dependency>
  • OK,到这一步就可以进行简单的增删改查功能了,然后我们就要写一个最简单的前端页面来实现excel的导入操作,前端页面代码如下:
<!doctypehtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><metahttp-equiv="X-UA-Compatible"content="ie=edge"><title>用户中心首页</title><scriptsrc="./js/vue.min.js"></script><scriptsrc="./js/jquery-3.6.0.min.js"></script><scriptsrc="./js/axios.min.js"></script></head><body><divid="app"><formmethod="post"action="/user/importExcel2"enctype="multipart/form-data"><inputtype="file"name="file"><inputtype="submit"value="提交"></form></div></body></html>

2.先实现导出为Excel表格

  • 第一步:首先导入工具类代码,这里工具栏代码无需我们自己手写:
packagecom.xxx.mybatisplus.Utils;importcn.afterturn.easypoi.excel.ExcelExportUtil;importcn.afterturn.easypoi.excel.ExcelImportUtil;importcn.afterturn.easypoi.excel.entity.ExportParams;importcn.afterturn.easypoi.excel.entity.ImportParams;importcn.afterturn.easypoi.excel.entity.enmus.ExcelType;importorg.apache.commons.lang3.StringUtils;importorg.apache.poi.ss.usermodel.Workbook;importorg.springframework.web.multipart.MultipartFile;importjavax.servlet.http.HttpServletResponse;importjava.io.File;importjava.io.IOException;importjava.net.URLEncoder;importjava.util.List;importjava.util.Map;importjava.util.NoSuchElementException;publicclassFileUtil{publicstaticvoidexportExcel(List<?> list,String title,String sheetName,Class<?> pojoClass,String fileName,boolean isCreateHeader,HttpServletResponse response){ExportParams exportParams=newExportParams(title, sheetName);
        exportParams.setCreateHeadRows(isCreateHeader);defaultExport(list, pojoClass, fileName, response, exportParams);}publicstaticvoidexportExcel(List<?> list,String title,String sheetName,Class<?> pojoClass,String fileName,HttpServletResponse response){defaultExport(list, pojoClass, fileName, response,newExportParams(title, sheetName));}publicstaticvoidexportExcel(List<Map<String,Object>> list,String fileName,HttpServletResponse response){defaultExport(list, fileName, response);}privatestaticvoiddefaultExport(List<?> list,Class<?> pojoClass,String fileName,HttpServletResponse response,ExportParams exportParams){Workbook workbook=ExcelExportUtil.exportExcel(exportParams,pojoClass,list);if(workbook!=null);downLoadExcel(fileName, response, workbook);}privatestaticvoiddownLoadExcel(String fileName,HttpServletResponse response,Workbook workbook){try{
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type","application/vnd.ms-excel");
            response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
            workbook.write(response.getOutputStream());}catch(IOException e){//throw new NormalException(e.getMessage());}}privatestaticvoiddefaultExport(List<Map<String,Object>> list,String fileName,HttpServletResponse response){Workbook workbook=ExcelExportUtil.exportExcel(list,ExcelType.HSSF);if(workbook!=null);downLoadExcel(fileName, response, workbook);}publicstatic<T>List<T>importExcel(String filePath,Integer titleRows,Integer headerRows,Class<T> pojoClass){if(StringUtils.isBlank(filePath)){returnnull;}ImportParams params=newImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);List<T> list=null;try{
            list=ExcelImportUtil.importExcel(newFile(filePath), pojoClass, params);}catch(NoSuchElementException e){// throw new NormalException("模板不能为空");}catch(Exception e){
            e.printStackTrace();// throw new NormalException(e.getMessage());}return list;}publicstatic<T>List<T>importExcel(MultipartFile file,Integer titleRows,Integer headerRows,Class<T> pojoClass){if(file==null){returnnull;}ImportParams params=newImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);List<T> list=null;try{
            list=ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);}catch(NoSuchElementException e){// throw new NormalException("excel文件不能为空");}catch(Exception e){// throw new NormalException(e.getMessage());}return list;}}
  • 然后在控制器中写方法,当我们访问的时候就下载一个excel文件。
@RestController@RequestMapping("/user")publicclassUserController{/**
     * 用户表导出为excel
     * @param response
     */@GetMapping("/downFile")publicvoiddownFile(HttpServletResponse response){List<User> users= userMapper.selectList(null);//title代表excel表格里面数据的标题//sheetName代表的是当前表格的名称//下载的表格名称FileUtil.exportExcel(users,"用户名单","名单1",User.class,"用户.xls",response);}}
  • 启动项目进行访问:
    在这里插入图片描述
    在这里插入图片描述
  • 这样数据中数据就可以导出来。

3.excel表格数据导入到数据库中去。

  • 我们先看一下数据中的数据:
    在这里插入图片描述
  • 然后我们新建一个excel表格,并且写一些数据:
    在这里插入图片描述
  • 然后我们就可以写控制器代码了,因为上面我们已经把前端的文件上传页面写好了,过会我们把excel文件进行上传就可以了,代码如下,ReslutOk是我写的一个结果类:
/**
     * excel导入数据库
     * @param file
     */@PostMapping("/importExcel2")publicReslutOkimportExcel2(@RequestParam("file")MultipartFile file){ImportParams importParams=newImportParams();// 数据处理
        importParams.setHeadRows(1);
        importParams.setTitleRows(1);// 需要验证
        importParams.setNeedVerfiy(true);try{ExcelImportResult<User> result=ExcelImportUtil.importExcelMore(file.getInputStream(),User.class, importParams);List<User> successList= result.getList();for(User user: successList){
                userMapper.insert(user);}returnReslutOk.ok("excel表数据导入成功!!!");}catch(IOException e){}catch(Exception e){}returnReslutOk.ok("excel表数据导入失败!!!");}
packagecom.xxx.mybatisplus.result;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;@Component@Data@AllArgsConstructor@NoArgsConstructor@Slf4jpublicclassReslutOk{privateString msg;privateboolean success;publicstaticReslutOkok(String msg){returnnewReslutOk(msg,true);}publicstaticReslutOkfail(String msg){returnnewReslutOk(msg,false);}}
  • ExcelImportUtil.importExcelMore主要使用该方法将excel表格中的数据一行的封装成传入的实体类,然后返回一个集合,这样我们就可以循环插入数据库了。
  • 看项目运行过程:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 成功!!!
  • 作者:程序逸
  • 原文链接:https://blog.csdn.net/qq_43265564/article/details/117519738
    更新时间:2022-10-17 08:35:28