java springboot web项目上传Excel解析成Bean与Bean数组组合数据下载成Excel,自定义标题,Hutool

前言

关于java控制Excel数据的操作是非常常见的,场景也是非常的多,这里我给大家分享一个通用基础的模板,方便大家自己去调试使用。


环境

springboot 2.2.7
jdk 1.8


导入工具

<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.4.2</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.17</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

说明:

  • hutool是一个开源的工具类,里面封装了很多常用的工具具体可以查看这个网站
  • poi-ooxml 是Apache旗下的一个开源项目,由Apache官方维护专门针对Excel做操作的组件

一、上传与解析Excel

1.准备一个Excel和对应的Bean对象

我们在F:\test文件夹中准备一个名叫abc.xlsx的Excel文件。文件内容如下:

在这里插入图片描述

在springboot中创建一个相对应的bean对象,get/set方法与toString方法请自己完成。

public class User {

    private String name;
    private Integer age;
    private Date birthDate;
}

编写接受上传文件的接口

前端就请自己写个很简单的上传即可,vue,html的均可。

@Controller
@RequestMapping("/excel")
public class ExcelController {

    @RequestMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file){
        // 判断文件是否为空,空则返回失败页面
        if (file.isEmpty()) {
            return "没有检测到上传的Excel文件。";
        }
        //获取Excel读取器
        ExcelReader excelReader = null;
        try {
            excelReader = ExcelUtil.getReader(file.getInputStream(), 0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置是否忽略空行
        excelReader.setIgnoreEmptyRow(true);
        //配置别名
        Map<String,String> aliasMap=new HashMap<>();
        aliasMap.put("姓名","name");
        aliasMap.put("年龄","age");
        aliasMap.put("出生日期","birthDate");
        excelReader.setHeaderAlias(aliasMap);
        // 第一个参数是指表头所在行,第二个参数是指从哪一行开始读取
        List<User> list= excelReader.read(0, 1, User.class);
        for (User user:list){
            System.out.println(user.toString());
        }
        return "上传解析成功!";
    }
}

将之前准备的abc.xlsx进行上传

在这里插入图片描述
我们可以看到,系统已经把完整的数据读取出来了。
笔者在这里边写边给大家做教程的时候遇到一个问题,因为本人用的vue,前端报错了CORS的跨域问题,需要大家加个配置防止跨域即可,具体情况跨域参考本人另一篇博客,传送门,当然,大家也可以自行解决。

二、下载为Excel

准备数据

我们还是以刚刚的系统为基础,组装一份User对象的数据。

//组装List数据
    private List<User> getList(){
        List<User> list=new ArrayList<>();
        list.add(new User("李一",22,new Date()));
        list.add(new User("李二",27,new Date()));
        list.add(new User("李三",33,new Date()));
        list.add(new User("李四",55,new Date()));
        list.add(new User("李五",76,new Date()));
        return list;
    }

编写Controller

@RequestMapping("/download")
    public void download(HttpServletResponse response){
        List<User> list=this.getList();
        //参数ture代表导出为xlsx格式,false代表xls格式
        ExcelWriter writer = ExcelUtil.getWriter(true);
        //配置表头
        writer.addHeaderAlias("name", "姓名");
        writer.addHeaderAlias("age", "年龄");
        writer.addHeaderAlias("birthDate", "出生日期");
        //使用表头,只有存在表头配置的字段才会输出
        writer.setOnlyAlias(true);
        writer.write(list, true);
        response.setHeader("content-Type", "application/vnd.ms-excel");
        ServletOutputStream out=null;
        try {
            response.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode("S4C.xlsx", "UTF-8") + "");
            response.setCharacterEncoding("UTF-8");
             out = response.getOutputStream();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        writer.flush(out, true);
        writer.close();
        IoUtil.close(out);
    }

注意: 配置表头别名时,我们尽量不要使用writer.setHeaderAlias()这个方法,这个虽然看似方便可以像上传解析一样直接放入一个Map,但是导出的数据标题顺序是不固定的。

请求该接口

在这里插入图片描述

打开该文件

在这里插入图片描述


总结

由此可见,使用Hutool工具可以很方便的进行Excel的上传与下载,当然该组件还支持其他自定义单元格的功能,大家可以通过这个网站去查看下,传送门

如果觉得有帮助的话给个免费的点赞吧,Thanks♪(・ω・)ノ

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页