2025 FastExcel在Java的Maven项目的导出和导入,简单易上手,以下为完整示例
注意:
示例项目是java的springboot+mybatis-flex框架下写的,引入中会涉及到import com.mybatisflex.xxxx的依赖,根据自己的实际情况写实体类即可
1、用户表
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依赖【重点】
<!-- fastexcel -->
<dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.3.0</version>
</dependency>
3、实体类【重点 @ExcelProperty("xxx")】
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、监听【重点】
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 当前分析上下文*/@Overridepublic void invoke(T t, AnalysisContext analysisContext) {dataList.add(t);}/*** 在所有数据解析完成后,打印读取到的数据条数* @param analysisContext 当前分析上下文*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("成功读取!共读取到 " + dataList.size() + " 条数据");}/*** 返回读取到的数据列表* @return 包含所有读取到的数据的列表*/public List<T> getDataList() {return dataList;}
}
5、控制层【重点】
为了直观感受,直接将业务逻辑写到了控制层【实际中业务逻辑自行写到实现类】
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 {@Resourceprivate 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("文件处理失败!");}}}