使用hutool工具导入导出表格(Maven 项目)

了解更多可参考官网哦 https://www.hutool.cn/

1. 在pom.xml中去引入依赖

        <!--hutool-->

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.20</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

2. 创建导出接口

在你的controller里面添加对应接口

        /**
         * 导出用户信息接口
         *
         * @param response HttpServletResponse对象,用于向客户端返回Excel文件流
         * @throws Exception 当导出过程中出现异常时抛出,如文件操作失败、流操作失败等
         *
         * 功能说明:
         * 1. 从数据库查询所有用户信息
         * 2. 使用Hutool的ExcelUtil工具创建ExcelWriter对象,在内存中操作Excel
         * 3. 设置Excel表头别名,将英文属性名映射为中文表头
         * 4. 将查询到的用户数据写入Excel
         * 5. 设置HTTP响应头,指定内容类型为Excel文件,并设置文件名
         * 6. 将Excel文件流输出到客户端浏览器
         * 7. 关闭输出流和ExcelWriter,释放资源
         *
         * 注意事项:
         * 1. 该接口会直接返回Excel文件流,前端无需解析,直接下载即可
         * 2. 确保客户端浏览器能够正确处理响应头中的编码设置
         */
        @GetMapping("/export")
        public void export(HttpServletResponse response) throws Exception {
                // 从数据库查询所有的数据
                List<Users> list = usersService.list();
                // 通过工具类创建 writer写到磁盘路径
//                ExcelWriter writer = ExcelUtil.getWriter(filesUploadPath + "/用户信息.xlsx");
                // 在内存操作,写到浏览器
                ExcelWriter writer = ExcelUtil.getWriter(false);
                // 自定义标题别名
                writer.addHeaderAlias("id", "用户ID");
                writer.addHeaderAlias("username", "用户名");
                writer.addHeaderAlias("password", "密码");
                writer.addHeaderAlias("nickname", "昵称");
                writer.addHeaderAlias("email", "邮箱");
                writer.addHeaderAlias("phone", "电话");
                writer.addHeaderAlias("address", "地址");
                writer.addHeaderAlias("avatarUrl", "头像");
                writer.addHeaderAlias("createdTime", "创建时间");
                writer.addHeaderAlias("updatedTime", "更新时间");

                // 一次性写出list内的对象到excel, 使用默认样式, 强制输出标题
                writer.write(list,true);

                //设置浏览器响应的格式
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
                String fileName = URLEncoder.encode("用户表信息", "UTF-8");
                response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

                ServletOutputStream out = response.getOutputStream();
                writer.flush(out,true);
                out.close();
                writer.close();
        }

注意:自定义标题别名处应于你的entity保持一致,我的是这样的

package com.zwt.demolearn.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * <p>
 * 普通用户表
 * </p>
 *
 * @author zwt
 * @since 2025-05-04
 */
@Getter
@Setter
@TableName
@ApiModel(value = "Users对象", description = "普通用户表")
@ToString
public class Users implements Serializable {

    private static final long serialVersionUID = 1L;

      @ApiModelProperty("用户ID")
        @TableId(value = "id", type = IdType.AUTO)
      private Long id;

      @ApiModelProperty("用户名")
      private String username;

      @ApiModelProperty("昵称")
      private String nickname;

      @ApiModelProperty("密码")
      private String password;

      @ApiModelProperty("邮箱")
      private String email;

      @ApiModelProperty("手机号")
      private String phone;

      @ApiModelProperty("地址")
      private String address;

      @ApiModelProperty("头像")
      private String avatarUrl;

      @ApiModelProperty("用户状态: 0-禁用,1-正常")
      private Integer status;

      @ApiModelProperty("创建时间")
      private LocalDateTime createdTime;

      @ApiModelProperty("更新时间")
      private LocalDateTime updatedTime;


}

3.测试导出接口

在浏览器中输入http://localhost:9090/users/export

地址拼接方法: http://localhost:+你的后端端口号+接口路径

进入到application.propertiesapplication.yml文件中查看方法后端端口号(我的是9090)

接口路径为 @RequestMapping处的路径+接口方法的路径

@RequestMapping处的路径: (我的是/users)

接口方法的路径: (我的是/export)

去浏览器输入你的路径

 弹出下载窗口(不同浏览器弹出效果不同 - 有表格下载请求就说明成功啦)

4. 创建导入接口 

下面是一个简单的例子

        /**
         * 导入用户数据Excel文件并保存到数据库
         *
         * @param file 上传的Excel文件
         * @return 导入成功返回true
         * @throws Exception 文件读取或数据处理异常
         *
         * 功能说明:
         * 1. 接收一个Excel文件作为输入
         * 2. 使用方式二读取Excel内容(忽略表头,从第二行开始读取数据)
         * 3. 将Excel每行数据映射为Users对象
         * 4. 批量保存所有用户数据到数据库
         *
         * Excel文件格式要求:
         * - 第一行为表头(会被忽略)
         * - 后续每行包含用户完整信息,按顺序为:
         *   1. 用户名
         *   2. 昵称
         *   3. 密码
         *   4. 邮箱
         *   5. 电话
         *   6. 地址
         *   7. 头像URL
         *
         * 注意事项:
         * - 确保Excel文件格式符合要求,否则可能导致数据映射错误
         * - 所有字段不能为空,否则会抛出异常
         * - 批量保存数据量较大时可能影响性能
         */
        @PostMapping("/import")
        public boolean imp(MultipartFile file) throws Exception {
                InputStream inputStream = file.getInputStream();
                ExcelReader reader = ExcelUtil.getReader(inputStream);
                // 方式一: 简单,但是是通过 javabean 方式读取Excel对象, 要求表头必须是英文, 更javabean的属性要对应
                // List<Users> list = reader.readAll(Users.class);

                // 方式2: 忽略表头中文,直接读取表的内容
                List<List<Object>> list = reader.read(1);
                List<Users> users = CollUtil.newArrayList();
                for(List<Object> row : list){
                        Users user = new Users();
                        user.setUsername(row.get(0).toString());
                        user.setNickname(row.get(1).toString());
                        user.setPassword(row.get(2).toString());
                        user.setEmail(row.get(3).toString());
                        user.setPhone(row.get(4).toString());
                        user.setAddress(row.get(5).toString());
                        user.setAvatarUrl(row.get(6).toString());
                        users.add(user);
                }
                usersService.saveBatch(users);
                return true;
        }

5.测试导入接口

首先查看测试前的数据库内容

简单处理一下要导入的表格( 把id列去掉 , 一般来说id被设置成主键, 不允许重复 )

去postman测试接口 

(如果有报错, 先查看自己的数据库表设计有没有其他的唯一约束, 再核对自己要插入的表格信息)

再查看数据库(刷新一下数据库)

测试成功!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值