vue + springboot(hutool)实现excel表格的导出导入

此处不写vue的详细内容了(怎么下载后台返回的流文件), 其他文章有发布详细内容 链接.

本文重点的是java怎么通过hutool这个工具类生成excel表格的

实现功能: 导出excel表格为文件, 导入(读取)excel文件为数据, 导出excel模板跟导出excel是一个方法! 它会自动分辨是导出模板, 还是导出数据, 大致功能一样索性就写一起了 哈哈哈.
读取: 通过axios把需要生成excel表的数据发送过来, 使用list接收.

导入依赖

  <!-- hutool 工具类 -->
   <dependency>
       <groupId>cn.hutool</groupId>
       <artifactId>hutool-all</artifactId>
       <version>5.5.6</version>
   </dependency>
  <!-- Java程序对Microsoft Office格式档案读和写的功能 -->
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>4.1.2</version>
   </dependency>

controler

package com.gsz.hutoolexcel.controller;

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.gsz.hutoolexcel.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@Slf4j
@RestController
public class VueTestController {

    /**
     * vue 请求到此接口 生成一个excel表格 存储到 response 中
     * @param users
     * @param response
     * @return 
     */
    @RequestMapping("/vue")
    public void test(@RequestBody List<User> users, HttpServletResponse response){

        // 生成excel表 使用hutool工具类
        ExcelWriter writer = ExcelUtil.getWriter(true);

        // 设置标题信息
        writer.merge(3,"用户基本信息");

        // 设置这个文档 header 别名
        writer.addHeaderAlias("name","姓名");
        writer.addHeaderAlias("sex","性别");
        writer.addHeaderAlias("address","地址");
        writer.addHeaderAlias("date","日期");

        // 每个单元格自动宽度
        writer.autoSizeColumnAll();

        log.info("数据的长度:{}",users.size());

        // 判断这个携带的参数是否有数据没有则导出模板 不用生成下拉列表
        if (users == null || users.size() < 1){
            // 创建一个对象 传入以上那个集合中然后创建 模板
            users.add(new User("例: 张三","石家庄","男","2022/10/13"));
        }

        // 生成下拉列表 根据用户的长度进行下拉列表的生成
        for (int i = 0; i < users.size(); i++) {
            // 设置下拉列表 这里将这个 i + 2 是为了跳过开头的两条标题
            writer.addSelect(1,i + 2,"男","女");
        }

        // 一次性写入 强制输入标题: true
        writer.write(users,true);

        // 写出xls文件方式
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
        response.setHeader("Content-Disposition","attachment;");

        // Servlet输出流 用来写回给浏览器
        ServletOutputStream out= null;
        try {
            // 进行赋值
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将 excel 表刷入到 ServletOutputStream 输出流
        writer.flush(out, true);

        //关闭writer,释放内存
        writer.close();
        // 关闭Servlet流
        IoUtil.close(out);

        log.info("excel已生成!");
    }

    /**
     *  用户传入一个excel类型的file文件 进行读取并且返回给前端读取出来的对象
     * @param file 用户传入一个excel文件 前端传入的文件key必须为file
     * @return excel文件中的数据
     */
    @RequestMapping("/importExcel")
    public List<User> importExcel(RequestParam("file") MultipartFile file){

        // 获取上传文件的名称 打印日志
        log.info("filename:{}", file.getOriginalFilename());
        
        // 用来存储这个文件中读取的对象
        List<User> read = null;

        try {
            // 将传入excel文件转换为输入流
            InputStream inputStream = file.getInputStream();

            // 读取excel文件中的数据
            ExcelReader reader = ExcelUtil.getReader(inputStream);

            // 设置这个文档 header 别名
            reader.addHeaderAlias("姓名","name");
            reader.addHeaderAlias("性别","sex");
            reader.addHeaderAlias("地址","address");
            reader.addHeaderAlias("日期","date");

            // 进行赋值 读取excel表中的数据为 bean (标题所在行,起始行), 从0开始
            read = reader.read(1,2,User.class);

            log.info("文件中的数据: {}",read);

        } catch (IOException e) {
            e.printStackTrace();
        }

        // 进行返回
        return read;
    }

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值