注意:
示例项目是java的springboot+mybatis-flex框架下写的,引入中会涉及到import com.mybatisflex.xxxx的依赖,根据自己的实际情况写实体类即可
1、用户表
sql
CREATE TABLE `users` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号码',
`name` varchar(20) DEFAULT NULL COMMENT '名字',
`sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别',
`province` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '省',
`city` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '市'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户' ROW_FORMAT=COMPACT;
2、pom依赖【重点】
XML
<!-- fastexcel -->
<dependency>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>1.3.0</version>
</dependency>
3、实体类【重点 @ExcelProperty("xxx")】
java
package com.jiaketao.entity;
import cn.idev.excel.annotation.ExcelProperty;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 用户
*
* @author
* @since 2025-09-17
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("users")
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@Id(keyType = KeyType.Auto)
private Integer id;
/**
* 手机号码
*/
@ExcelProperty("手机号码")
private String tel;
/**
* 名字
*/
@ExcelProperty("名字")
private String name;
/**
* 性别
*/
@ExcelProperty("性别")
private String sex;
/**
* 省
*/
@ExcelProperty("省")
private String province;
/**
* 市
*/
@ExcelProperty("市")
private String city;
}
4、监听【重点】
java
package com.jiaketao.config.excel;
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
/**
* 快速Excel读取监听器,继承自AnalysisEventListener,用于处理Excel文件的读取事件
*/
public class FastExcelReadListener<T> extends AnalysisEventListener<T> {
private List<T> dataList = new ArrayList<>();
/**
* 当读取到一行数据时,将数据添加到dataList中
* @param t 读取到的数据对象
* @param analysisContext 当前分析上下文
*/
@Override
public void invoke(T t, AnalysisContext analysisContext) {
dataList.add(t);
}
/**
* 在所有数据解析完成后,打印读取到的数据条数
* @param analysisContext 当前分析上下文
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("成功读取!共读取到 " + dataList.size() + " 条数据");
}
/**
* 返回读取到的数据列表
* @return 包含所有读取到的数据的列表
*/
public List<T> getDataList() {
return dataList;
}
}
5、控制层【重点】
为了直观感受,直接将业务逻辑写到了控制层【实际中业务逻辑自行写到实现类】
java
package com.jiaketao.controller;
import cn.idev.excel.FastExcel;
import com.jiaketao.config.excel.FastExcelReadListener;
import com.jiaketao.entity.Users;
import com.jiaketao.mapper.UsersMapper;
import com.sun.deploy.net.URLEncoder;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 用户信息
*
* @author
* @since 2025-09-17
*/
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UsersController {
@Resource
private UsersMapper usersMapper;
/**
* Excel导出
*
* @param response
* @throws IOException
*/
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
// 设置响应头信息
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 设置编码格式
response.setCharacterEncoding("utf-8");
// 设置文件名:可以自己自定义
String fileName = URLEncoder.encode("数据列表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
//获取要导出的数据列表【可行从数据库中获取】
List<Users> exportList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Users data = new Users();
data.setId(i);
data.setTel("1380013800" + i);
data.setName("张三" + i);
data.setSex("男");
data.setProvince("广东省");
data.setCity("广州市");
exportList.add(data);
}
// 写入数据
FastExcel.write(response.getOutputStream(), Users.class)
.sheet("模板")// 工作簿名称【可以不写】
.excludeColumnFieldNames(Arrays.asList("id"))// 导出忽略某些字段【都导出的话,可以不写】
.doWrite(exportList);// 写入数据
}
/**
* Excel导入
*
* @param file
* @return 返回响应自行定义,该方法只供参考
* @throws IOException
*/
@PostMapping("/importData")
public ResponseEntity<String> importEmp(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body("请选择一个文件上传!");
}
try {
//读取excel的内容
FastExcelReadListener<Users> baseExcelListener = new FastExcelReadListener<>();
FastExcel.read(file.getInputStream(), Users.class, baseExcelListener).sheet().doRead();
//获取读取的数据列表
List<Users> dataList = baseExcelListener.getDataList();
//判断是否为空数据
if (CollectionUtils.isEmpty(dataList)) {
return ResponseEntity.badRequest().body("文件中没有数据!");
}
//新增数据到数据库的业务逻辑
usersMapper.insertBatch(dataList);
return ResponseEntity.ok("文件上传并处理成功!");
} catch (IOException e) {
return ResponseEntity.badRequest().body("文件处理失败!");
}
}
}
6、Apifox测试
(1)导出
