2025 FastExcel在Java的Maven项目的导出和导入,简单易上手,以下为完整示例

注意:

示例项目是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)导出

(2)导入

相关推荐
AntsData10 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat10 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰10 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang11 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞11 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长11 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs12 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
golang学习记12 小时前
IDEA 开始换芯,发布全新AI版终端
java·人工智能·intellij-idea
vipxieliang12 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
Wang's Blog12 小时前
Java 项目实战:交友项目 - FastDFS 工作原理
java·大数据·交友