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

相关推荐
有梦想的攻城狮3 小时前
Maven中的settings.xml文件配置详解
xml·java·maven·settings.xml
wearegogog1233 小时前
液压位置控制源代码实现与解析(C语言+MATLAB联合方案)
java·c语言·matlab
游坦之3 小时前
基于Java Swing的智能数据结构可视化系统 | 支持自然语言交互的AI算法助手
java·数据结构·交互
王嘉俊9253 小时前
设计模式--装饰器模式:动态扩展对象功能的优雅设计
java·设计模式·装饰器模式
循着风3 小时前
多种二分查找
java
努力也学不会java3 小时前
【Java并发】深入理解synchronized
java·开发语言·人工智能·juc
TDengine (老段)3 小时前
TDengine 数学函数 CEIL 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
LB21124 小时前
Redis 黑马skyout
java·数据库·redis
豐儀麟阁贵4 小时前
Java知识点储备
java·开发语言