Springboot+Vue实现批量导入excel、批量导出excel

批量导出excel

页面代码

页面

<el-button type="success" style="margin-left: 10px" @click="exp()">导出报表</el-button>

js:

exp() {
    let user = localStorage.getItem("user");
    location.href = 'http://localhost:8080/api/type/export?token=' + JSON.parse(user).token
},

后台接口

@GetMapping("/export")
public Result export(HttpServletResponse response) throws IOException {
    // 思考:
    // 要一行一行的组装数据,塞到一个list里面
    // 每一行数据,其实就对应数据库表中的一行数据,也就是对应Java的一个实体类Type
    // 我们怎么知道它某一列就是对应某个表头呢?? 需要映射数据,我们需要一个Map<key,value>,把这个map塞到list里

    // 干!
    // 1. 从数据库中查询出所有数据
    List<Type> all = typeService.findAll();

    if (CollectionUtil.isEmpty(all)) {
        throw new CustomException("未找到数据");
    }

    // 2. 定义一个 List,存储处理之后的数据,用于塞到 list 里
    List<Map<String, Object>> list = new ArrayList<>(all.size());

    // 3. 定义Map<key,value> 出来,遍历每一条数据,然后封装到 Map<key,value> 里,把这个 map 塞到 list 里
    for (Type type : all) {
        Map<String, Object> row = new HashMap<>();
        row.put("分类名称", type.getName());
        row.put("分类描述", type.getDescription());

        list.add(row);
    }

    // 4. 创建一个 ExcelWriter,把 list 数据用这个writer写出来(生成出来)
    ExcelWriter wr = ExcelUtil.getWriter(true);
    wr.write(list, true);

    // 5. 把这个 excel 下载下来
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
    response.setHeader("Content-Disposition","attachment;filename=type.xlsx");
    ServletOutputStream out = response.getOutputStream();
    wr.flush(out, true);
    wr.close();
    IoUtil.close(System.out);


    return Result.success();
}

Tips:会有个报错:
cn.hutool.core.exceptions.DependencyException: You need to add dependency of 'poi-ooxml' to your project, and version >= 4.1.2

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>

批量导入

页面代码

<el-upload action="http://localhost:8080/api/type/upload" style="display: inline-block; margin-left: 10px" :show-file-list="false" :on-success="successUpload">
<el-button size="small" type="primary">批量导入</el-button>
</el-upload>
successUpload(res) {
    if (res.code === '0') {
        this.$message.success("批量导入成功")
        this.findBySearch()
    } else {
        this.$message.error(res.msg)
    }
}

后台接口

@PostMapping("/upload")
public Result upload(MultipartFile file) throws IOException {
    List<Type> infoList = ExcelUtil.getReader(file.getInputStream()).readAll(Type.class);
    if (!CollectionUtil.isEmpty(infoList)) {
        for (Type type : infoList) {
            try {
                typeService.add(type);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return Result.success();
}

注意:实体类上面需要加@Alias("分类名称"),否则没法自动映射
批量导入的接口放行

// 加自定义拦截器JwtInterceptor,设置拦截规则
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor).addPathPatterns("/api/**")
.excludePathPatterns("/api/files/**")
.excludePathPatterns("/api/type/upload")
.excludePathPatterns("/api/admin/login")
.excludePathPatterns("/api/admin/register");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值