了解更多可参考官网哦 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.properties
或application.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测试接口
(如果有报错, 先查看自己的数据库表设计有没有其他的唯一约束, 再核对自己要插入的表格信息)
再查看数据库(刷新一下数据库)
测试成功!!!