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)导入

相关推荐
guodingdingh1 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯3 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu