Spring Boot + EasyExcel 实现 Excel 导入导出(实战篇)

EasyExcel导出(单Sheet导出、多Sheet导出、多文件导出) 【代码】EasyExcel导出(单Sheet导出、多Sheet导出、多文件导出) 阅读详情

Spring Boot + EasyExcel 实现 Excel 导入导出(实战篇)

上一篇我们已经掌握了Spring Boot文件上传的核心技巧,而Excel导入导出正是文件操作的延伸与核心落地场景——无论是日常办公的数据批量录入、系统数据备份,还是你要开发的小工具(如数据管理工具、报表工具),Excel导入导出都是不可或缺的核心功能。本文精准聚焦“落地小工具”需求,手把手实战EasyExcel整合Spring Boot,从依赖引入、实体类注解设计,到批量导入数据库、数据导出为Excel文件,全程贴合实际开发场景,代码可直接复制复用,帮你快速落地小工具核心功能,精准对接需求、高效引流。

一、前置准备:明确实战场景与环境搭建

本次实战以「用户数据管理」为核心场景(适配大多数小工具需求),实现两个核心功能:① 上传Excel文件,批量导入用户数据到数据库;② 查询数据库用户数据,导出为Excel文件。环境基于Spring Boot + EasyExcel + MyBatis-Plus + MySQL,简化复杂配置,聚焦核心功能落地。

1.1 核心依赖引入

重点引入EasyExcel核心依赖(轻量高效,避免POI的内存溢出问题),搭配MyBatis-Plus操作数据库,无需额外引入过多组件,适配小工具轻量需求:

<!-- Spring Boot Web 核心依赖(支持文件上传) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- EasyExcel 核心依赖(导入导出核心,推荐3.3.2版本,稳定无bug) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

<!-- MyBatis-Plus 核心依赖(操作数据库,简化CRUD) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- lombok 简化代码(实体类、工具类无需写getter/setter) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<!-- commons-io 工具类(简化文件操作,可选) -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

1.2 核心配置(application.yml)

配置数据库连接、EasyExcel相关优化(可选)、文件上传限制,集中管理,便于后续部署修改,贴合小工具开发的简洁需求:

spring:
  # 数据库配置(替换为自己的数据库地址、用户名、密码)
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_easyexcel?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: 123456

  # 文件上传配置(适配Excel导入,限制单个文件大小)
  servlet:
    multipart:
      enabled: true
      max-file-size: 50MB # 单个Excel文件最大50MB,满足大数据量导入
      max-request-size: 100MB

# MyBatis-Plus 配置
mybatis-plus:
  mapper-locations: classpath:mybatis/mapper/**/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    map-underscore-to-camel-case: true # 驼峰命名映射
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志,便于调试

# EasyExcel 自定义配置(可选,优化解析性能)
easyexcel:
  reader:
    batch-size: 100 # 批量读取行数,避免内存占用过高
    head-row-number: 1 # 默认表头行数(第0行是表头)
  writer:
    auto-close-stream: true # 自动关闭流,避免资源泄露

1.3 数据库表设计(用户表)

设计简单的用户表,用于存储Excel导入的数据、提供导出数据源,字段与Excel表头一一对应,适配小工具数据管理需求:

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
  `username` varchar(50) NOT NULL COMMENT '用户名(唯一)',
  `phone` varchar(11) DEFAULT NULL COMMENT '手机号',
  `role` varchar(20) NOT NULL COMMENT '用户角色(admin/普通用户)',
  `status` tinyint(1) DEFAULT 1 COMMENT '状态(1:正常,0:禁用)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';

二、核心实战一:实体类注解设计(EasyExcel核心)

EasyExcel的核心优势的是“注解驱动”,无需手动解析Excel单元格,通过注解将实体类与Excel表头绑定,同时关联数据库实体,实现“Excel数据→实体类→数据库”的无缝映射,是导入导出的基础。

我们需要创建两个关联实体(可复用一个,按需区分):① 数据库实体(SysUser):映射数据库表;② Excel解析实体(ExcelUserDTO):映射Excel表头,通过EasyExcel注解配置。

2.1 数据库实体(SysUser)

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 数据库实体类(映射sys_user表)
 */
@Data
@TableName("sys_user")
public class SysUser {
    @TableId(type = IdType.AUTO)
    private Long id;

    // 用户名(与Excel表头“用户名”对应)
    private String username;

    // 手机号(与Excel表头“手机号”对应)
    private String phone;

    // 角色(与Excel表头“角色”对应)
    private String role;

    // 状态(默认1正常,Excel导入时可省略,自动填充)
    private Integer status = 1;

    // 创建时间(自动填充,无需Excel导入)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}

2.2 Excel解析实体(ExcelUserDTO)

核心是EasyExcel注解,通过@ExcelProperty绑定Excel表头,明确列索引和表头名称,同时可添加数据校验、格式转换注解,适配Excel导入导出需求:

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;

/**
 * Excel解析实体类(与Excel表头绑定,用于导入导出)
 * 注解说明:
 * 1. @ExcelProperty:核心注解,value=Excel表头名称,index=列索引(0开始)
 * 2. @ExcelIgnore:忽略该字段,不导入也不导出
 * 3. @NotBlank:数据校验,导入时用户名不能为空
 * 4. @NumberFormat:格式转换(如手机号转为字符串,避免科学计数法)
 */
@Data
public class ExcelUserDTO {

    @ExcelIgnore // 主键自增,Excel中无该字段,忽略
    private Long id;

    @ExcelProperty(value = "用户名", index = 0) // 对应Excel第0列,表头“用户名”
    @NotBlank(message = "用户名不能为空") // 导入时校验,为空则报错
    private String username;

    @ExcelProperty(value = "手机号", index = 1) // 对应Excel第1列,表头“手机号”
    @NumberFormat("#") // 避免手机号(纯数字)转为科学计数法
    private String phone;

    @ExcelProperty(value = "角色", index = 2) // 对应Excel第2列,表头“角色”
    @NotBlank(message = "角色不能为空")
    private String role;

    @ExcelIgnore // 状态自动填充,不导入不导出
    private Integer status;

    @ExcelIgnore // 创建时间自动填充,不导入不导出
    private LocalDateTime createTime;
}

关键注意点:

  1. Excel表头名称必须与@ExcelProperty的value完全一致(大小写、空格都要匹配),否则无法解析;
  2. 无需导入/导出的字段,添加@ExcelIgnore注解,避免冗余;
  3. 导入时的数据校验(如@NotBlank),可提前拦截非法数据,减少数据库异常。

三、核心实战二:Excel批量导入数据库(小工具核心功能)

Excel导入的核心逻辑:前端上传Excel文件 → 后端通过EasyExcel监听器解析Excel数据 → 数据校验 → 批量存入数据库,全程无冗余代码,适配小工具的高效落地需求。

3.1 自定义EasyExcel监听器(核心)

EasyExcel采用“监听器模式”解析Excel,自定义监听器处理每一行解析后的数据,实现数据校验、批量入库(避免频繁操作数据库,提升性能):

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.dto.ExcelUserDTO;
import com.example.demo.entity.SysUser;
import com.example.demo.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.List;

/**
 * EasyExcel 导入监听器(处理Excel解析后的每一行数据)
 * 说明:监听器不能被Spring管理,需手动new,因此通过构造方法传入Service
 */
@Slf4j
public class ExcelUserImportListener extends AnalysisEventListener<ExcelUserDTO> {

    // 批量入库阈值(每100条数据批量插入一次,可调整)
    private static final int BATCH_SIZE = 100;
    // 存储解析后的Excel数据
    private List<ExcelUserDTO> userList = new ArrayList<>();
    // 注入用户Service,用于批量入库
    private final SysUserService sysUserService;
    // 数据校验器(校验Excel中的数据合法性)
    private final Validator validator;

    // 构造方法,传入Service(监听器无法被Spring自动注入,手动传入)
    public ExcelUserImportListener(SysUserService sysUserService) {
        this.sysUserService = sysUserService;
        // 初始化校验器
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator();
    }

    /**
     * 每解析一行Excel数据,就会调用该方法
     * @param data 解析后的一行数据(与ExcelUserDTO对应)
     * @param context 解析上下文
     */
    @Override
    public void invoke(ExcelUserDTO data, AnalysisContext context) {
        log.info("解析Excel数据:{}", data);
        // 1. 数据校验(校验用户名、角色非空等)
        var violations = validator.validate(data);
        if (!violations.isEmpty()) {
            // 校验失败,抛出异常(可自定义异常,返回具体错误信息)
            throw new RuntimeException("第" + (context.readRowHolder().getRowIndex() + 1) + "行数据非法:" + violations.iterator().next().getMessage());
        }
        // 2. 将数据添加到列表,达到阈值则批量入库
        userList.add(data);
        if (userList.size() >= BATCH_SIZE) {
            batchInsert(); // 批量入库
            userList.clear(); // 清空列表,避免内存占用过高
        }
    }

    /**
     * Excel解析完成后,调用该方法(处理剩余不足批量阈值的数据)
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 解析完成后,若还有剩余数据,批量入库
        if (!CollectionUtils.isEmpty(userList)) {
            batchInsert();
            userList.clear();
        }
        log.info("Excel数据解析完成,已全部导入数据库");
    }

    /**
     * 批量插入数据库(将ExcelUserDTO转为SysUser)
     */
    private void batchInsert() {
        // 转换DTO为数据库实体
        List<SysUser> sysUsers = userList.stream().map(dto -> {
            SysUser sysUser = new SysUser();
            BeanUtils.copyProperties(dto, sysUser); // 复制属性(忽略@ExcelIgnore的字段)
            return sysUser;
        }).toList();
        // 调用MyBatis-Plus批量插入方法
        sysUserService.saveBatch(sysUsers);
        log.info("批量插入{}条用户数据到数据库", sysUsers.size());
    }
}

3.2 Mapper与Service层实现(批量入库)

基于MyBatis-Plus简化CRUD操作,无需手动编写SQL,聚焦核心导入功能:

3.2.1 SysUserMapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;

/**
 * 用户Mapper接口(继承BaseMapper,无需编写SQL)
 */
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}
3.2.2 SysUserService
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.SysUser;
import com.example.demo.mapper.SysUserMapper;
import org.springframework.stereotype.Service;

/**
 * 用户Service层(继承ServiceImpl,自带批量插入、查询等方法)
 */
@Service
public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
    // 无需额外编写方法,ServiceImpl已提供saveBatch(批量插入)、list(查询所有)等方法
}

3.3 导入接口设计(Controller)

提供Excel上传接口,接收前端传入的Excel文件,调用监听器解析并批量入库,返回导入结果(成功条数、失败原因),贴合小工具的前端调用需求:

import com.alibaba.excel.EasyExcel;
import com.example.demo.dto.ExcelUserDTO;
import com.example.demo.listener.ExcelUserImportListener;
import com.example.demo.service.SysUserService;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * Excel导入导出控制器(小工具核心接口)
 */
@RestController
@RequestMapping("/excel")
public class ExcelImportExportController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * Excel批量导入数据库
     * @param file 前端上传的Excel文件(.xlsx、.xls)
     * @return 导入结果(成功条数、提示信息)
     */
    @PostMapping("/import")
    public ResponseEntity<Map<String, Object>> importExcel(@RequestParam("file") MultipartFile file) {
        Map&lt;String, Object&gt; result = new HashMap<>();
        try {
            // 1. 校验文件是否为空
            if (file.isEmpty()) {
                result.put("code", 400);
                result.put("message", "请选择要导入的Excel文件");
                return ResponseEntity.badRequest().body(result);
            }
            // 2. 校验文件格式(仅允许.xlsx、.xls)
            String suffix = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase();
            if (!"xlsx".equals(suffix) && !"xls".equals(suffix)) {
                result.put("code", 400);
                result.put("message", "文件格式不合法,仅支持.xlsx、.xls格式");
                return ResponseEntity.badRequest().body(result);
            }
            // 3. 初始化监听器(手动传入Service,因为监听器无法被Spring自动注入)
            ExcelUserImportListener listener = new ExcelUserImportListener(sysUserService);
            // 4. 解析Excel文件,开始导入
            EasyExcel.read(file.getInputStream(), ExcelUserDTO.class, listener)
                    .sheet() // 读取Excel第一个工作表(默认)
                    .headRowNumber(1) // 表头行数(1表示第0行是表头,从第1行开始读取数据)
                    .doRead(); // 开始解析

            // 5. 导入成功,返回结果
            result.put("code", 200);
            result.put("message", "Excel导入成功");
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            // 6. 导入失败,返回错误信息
            result.put("code", 500);
            result.put("message", "Excel导入失败:" + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
        }
    }
}

3.4 导入测试(Postman)

  1. 准备测试Excel:创建user.xlsx,表头为「用户名、手机号、角色」,填入几条测试数据(如:test1、13800138000、普通用户);

  2. 请求方式:POST,接口地址:http://localhost:8080/excel/import;

  3. 请求参数:file选择准备好的Excel文件;

  4. 响应结果(成功):

{
  "code": 200,
  "message": "Excel导入成功"
}
  1. 验证:查看数据库sys_user表,可看到Excel中的数据已批量导入,状态自动填充为1,创建时间自动生成。

四、核心实战三:数据导出为Excel文件(小工具核心功能)

Excel导出的核心逻辑:查询数据库中的数据 → 转换为Excel解析实体(ExcelUserDTO) → 通过EasyExcel生成Excel文件 → 响应给前端,支持浏览器直接下载,贴合小工具的日常使用需求。

4.1 导出接口设计(Controller)

无需额外编写监听器,直接调用EasyExcel的write方法,将数据库数据导出为Excel,支持自定义Excel文件名、工作表名称,适配不同场景:

// 在ExcelImportExportController中新增导出接口
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 导出数据库数据为Excel文件(支持浏览器直接下载)
 * @param response Http响应(用于返回Excel文件)
 */
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
    try {
        // 1. 查询数据库中的所有用户数据(可根据需求添加筛选条件,如查询正常状态的用户)
        List<SysUser> sysUserList = sysUserService.list();
        if (sysUserList.isEmpty()) {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write("{\"code\":400,\"message\":\"暂无数据可导出\"}");
            return;
        }

        // 2. 将数据库实体(SysUser)转为Excel解析实体(ExcelUserDTO)
        List<ExcelUserDTO> excelUserList = sysUserList.stream().map(sysUser -> {
            ExcelUserDTO dto = new ExcelUserDTO();
            BeanUtils.copyProperties(sysUser, dto);
            return dto;
        }).collect(Collectors.toList());

        // 3. 配置响应头,让浏览器识别并下载Excel文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 自定义Excel文件名(URLEncoder.encode处理中文乱码)
        String fileName = URLEncoder.encode("用户数据导出_" + System.currentTimeMillis(), "UTF-8");
        // 设置响应头,指定文件名和下载方式
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        // 4. 使用EasyExcel生成Excel并响应给前端
        EasyExcel.write(response.getOutputStream(), ExcelUserDTO.class)
                .sheet("用户列表") // Excel工作表名称
                .doWrite(excelUserList); // 写入数据,完成导出
    } catch (Exception e) {
        // 导出失败,返回错误信息
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("{\"code\":500,\"message\":\"Excel导出失败:" + e.getMessage() + "\"}");
    }
}

4.2 导出测试(浏览器/Postman)

  1. 方式一(浏览器):直接访问接口地址:http://localhost:8080/excel/export,浏览器会自动下载Excel文件;

  2. 方式二(Postman):发送GET请求,接口地址同上,点击“Save Response” → “Save to a file”,保存Excel文件;

  3. 验证:打开下载的Excel文件,可看到数据库中的用户数据已完整导出,表头与ExcelUserDTO注解配置一致,无冗余字段。

关键注意点:1. 响应头配置必须正确,否则浏览器可能无法识别Excel文件,导致下载后无法打开;2. 中文文件名需用URLEncoder.encode处理,避免中文乱码;3. 导出大数据量时,可使用EasyExcel的分批查询+分批写入,避免内存溢出。

五、小工具落地优化(可选,提升体验)

为了让你的小工具更专业、更易用,补充2个实用优化点,可直接集成到代码中:

5.1 导入失败回滚(避免部分数据导入成功)

在Service层添加事务注解,当导入过程中出现异常时,自动回滚所有已插入的数据,保证数据一致性:

// 在SysUserService的批量插入方法上添加事务注解(或在Controller方法上添加)
import org.springframework.transaction.annotation.Transactional;

@Service
public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {

    // 添加事务注解,出现异常自动回滚
    @Transactional(rollbackFor = Exception.class)
    public boolean saveBatch(List<SysUser> entityList) {
        return super.saveBatch(entityList);
    }
}

5.2 导出数据筛选(适配实际需求)

修改导出接口,支持按条件筛选导出(如按角色、状态筛选),让小工具更灵活:

// 新增带筛选条件的导出接口
@GetMapping("/export/filter")
public void exportExcelByFilter(
        @RequestParam(required = false) String role, // 按角色筛选
        @RequestParam(required = false) Integer status, // 按状态筛选
        HttpServletResponse response) throws IOException {
    try {
        // 构建查询条件(MyBatis-Plus的条件构造器)
        QueryWrapper<SysUser&gt; queryWrapper = new QueryWrapper<>();
        if (role != null && !role.isEmpty()) {
            queryWrapper.eq("role", role);
        }
        if (status != null) {
            queryWrapper.eq("status", status);
        }
        // 按条件查询数据
        List<SysUser> sysUserList = sysUserService.list(queryWrapper);
        // 后续逻辑与普通导出一致(转换DTO、生成Excel)
        // ...(省略重复代码,与exportExcel方法一致)
    } catch (Exception e) {
        // 异常处理
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("{\"code\":500,\"message\":\"Excel导出失败:" + e.getMessage() + "\"}");
    }
}

六、常见问题与解决方案(小工具落地避坑)

  1. Excel导入时,提示“监听器中Service为null”?

    解决方案:EasyExcel监听器不能被Spring自动注入(生命周期问题),需通过构造方法手动传入Service,如new ExcelUserImportListener(sysUserService)。
    
  2. 导出Excel后,打开提示“文件损坏”?

    解决方案:① 检查响应头配置是否正确(Content-Type是否为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);② 确保EasyExcel的write方法正常执行,无异常中断;③ 避免在导出过程中关闭响应流。
    
  3. 导入时,手机号转为科学计数法?

    解决方案:在ExcelUserDTO的phone字段添加@NumberFormat("#")注解,或在Excel中将手机号列设置为“文本格式”。
    
  4. 大数据量导入时,内存溢出?

    解决方案:① 调整监听器中的BATCH_SIZE(如100、200),减少单次内存占用;② 开启EasyExcel的分批读取,通过.headRowNumber(1).batchRead(100)配置;③ 避免在监听器中存储过多数据。
    
  5. Excel表头与实体类注解不匹配,解析无数据?

    解决方案:确保@ExcelProperty的value与Excel表头完全一致(大小写、空格、特殊字符都要匹配),或通过index指定列索引(更稳妥)。
    

七、总结(小工具落地总结)

本文承接文件上传的基础,完整落地了Spring Boot + EasyExcel的Excel导入导出核心功能,精准贴合小工具开发需求,代码可直接复制复用,核心要点总结:

  • 依赖引入:仅需引入EasyExcel核心依赖,搭配MyBatis-Plus,简化开发,轻量高效;

  • 实体设计:通过EasyExcel注解绑定Excel表头,关联数据库实体,实现“Excel→实体→数据库”无缝映射;

  • 批量导入:自定义监听器处理解析、校验、批量入库,事务回滚保证数据一致性;

  • 数据导出:配置响应头,直接将数据库数据导出为Excel,支持浏览器下载和条件筛选。

掌握本文内容后,你可以直接将这些代码集成到自己的小工具中,快速实现Excel导入导出核心功能,精准满足用户数据管理需求,助力小工具引流转化。后续可进一步扩展:模板下载(提供Excel导入模板)、导入导出进度显示、异常日志记录等,让小工具更专业、更易用。

SpringBoot整合EasyExcel 金三银四马上就到了,希望大家能好好学习一下这些技术点学习视频:《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)金三银四马上就到了,希望大家能好好学习一下这些技术点学习视频:[外链图片转存中…(img-HHZNhYnH-1712078934419)] 阅读详情

相关推荐

掌握 EasyExcel:让 Excel 导入导出变得如此简单!

EasyExcel 是阿里巴巴开源的一个基于 Java 的简单、快速、小巧的 Excel 处理库。它旨在简化 Excel 文件的读写操作,提高开发效率,减少内存消耗。与传统的 Apache POI 相比,EasyExcel 在处理大文件时性能更优,更适合企业级应用。EasyExcel以其优秀的性能和简便的使用方法,在Java处理Excel问题上提供了极为有效的解决方案。对于日常工作中频繁遇到的数据导入导出场景,比如用户信息批量导入、订单数据导出、统计报告生成等,EasyExcel都能帮助我们高效完成任务。

weixin_45593273的博客 1284

SpringBoot:集成EasyExcel实现EasyExcel

当使用 EasyExcel 时,实体类需要按照以下规则进行定义。实体类需要添加 @ExcelIgnoreUnannotated 注解,以确保未被 @ExcelProperty 注解标记的字段被忽略。使用 @ExcelProperty 注解标记需要在 Excel 中读写的字段,可以指定字段在 Excel 中的列索引或列名。可以使用其他注解(如 @ExcelDateTimeFormat、@ExcelNumberFormat 等)来进一步定义字段的格式化规则。

GIS摆渡人 9848

SpringBoot操作Excel实现导入和导出功能(详细讲解+Gitee源码)

在日常的开发中,避免不了操作Excel,比如从系统当中导出一个报表,或者通过解析客户上传的Excel文件进行批量解析数据入库等等,本篇博客主要汇总日常开发中如何使用开源的Apache提供的POI流操作Excel进行导入导出功能详解

黄团团的个人博客 5827

Spring Boot + EasyExcel导入导出,简直太好用了!

在EasyExcel执行write方法之后,获得ExcelWriterBuilder类,通过该类的registerWriteHandler方法可以设置一些处理策略。/***设置单元格样式(仅用于示例)**@return样式策略*///表头策略//表头水平对齐居中//背景色//自动换行//内容策略//设置数据允许的数据格式,这里49代表所有可以都允许设置//设置背景色该类中示例设置了Excel的基础格式。/**/**...

程序新视界 8690

DolphinScheduler租户配置踩坑实录:手把手教你修复‘tenant not exists‘报错

本文深度解析DolphinScheduler的租户模型,并提供一套从界面到数据库的系统性排查流程,手把手教你修复常见的'tenant not exists'报错。文章揭示了该错误的本质是用户与租户数据关联不一致,并给出了通过UI或SQL更新的具体修复方案,同时分享了根因分析与预防措施,帮助用户从根本上理解和避免此类问题。

2w3e4r5t6y的博客 541

Abaqus 导出单元刚度矩阵和全局刚度矩阵

Abaqus 导出单元刚度矩阵和全局刚度矩阵

科技芯风 1万+

Spring Boot 集成 EasyExcel 3.x 优雅实现Excel导入导出

EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能。在EasyExcel中,以面向对象思想来实现导入导出,无论是导入数据还是导出数据都可以想象成具体某个对象的集合,所以为了实现导出用户信息功能,首先创建一个用户对象UserDO/*** 用户信息*@ExcelProperty("用户编号") @ColumnWidth(20) private Long id;

欲变世界,先变其身 4万+

UE5深度图与Mask图渲染实战:从基础到高级应用

本文详细解析了在UE5中渲染深度图与Mask图的完整实战流程。从启用电影渲染队列、配置自定义深度模板通道等前期准备,到构建即用型深度图材质网络与精准物体Mask生成,并深入探讨了二者结合在NPR风格化、程序化雾气及AI工作流(如ComfyUI)中的高级应用,为影视、游戏后期与AI创作提供了高效的解决方案。

weixin_29001419的博客 348

Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!转存中…(img-nXKNkIBX-1711813911374)]

2401_83641098的博客 1236

SpringBoot 通过 JMS 集成 IBM MQ

IBM MQ 作为老牌的企业级消息中间件,虽然在当下云原生时代已不再是主流选择,但在金融、银行、保险等传统行业的核心业务系统中仍然占据着重要地位。这些行业对系统的稳定性、可靠性和事务一致性有着极高的要求,IBM MQ 正是在这些方面表现出色。尽管近年来 RabbitMQ、Apache Kafka 等新一代消息中间件在新兴项目中更受欢迎,但许多金融公司和大型企业仍在使用 IBM MQ 作为核心业务系统的消息传递基础设施。

小单的博客专栏 947

EDF Browser使用说明和技巧

edf browser使用说明和一些小技巧

Erhu_666的博客 8308

Spring Boot使用EasyExcel导入导出Excel

Spring Boot使用EasyExcel导入导出Excel

吴名氏的博客 14万+

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

Spring Boot 集成 EasyExcel 导出 Excel 文件【复杂表头】

Excel 导出在项目开发中是一个非常常见的业务场景,通过 Java 相关的类库可以轻松实现 Excel 的读写操作,常见的类库有 Apache POI、EasyPoi 和 EasyExcel,本篇我们要分享的是使用 EasyExcel 完成复杂表头的 Excel 导出,希望可以帮助到有需要的朋友。我们并没有写多少代码,就完成了看起来比较复杂的表头,这就是 EasyExcel 带来效果,当前 EasyExcel 在内存管理上也有显著的优势。实现了我们开始说的表头效果,导出结果符合预期。

weixin_42118323的博客 2483

PCL 直通滤波器【2026最新版】

PCL直通滤波器函数详解以及用于多字段滤波、强度滤波、获取某一时间范围内的点等高阶用法案例分享。博客长期更新,本文最近一次更新时间为:2026年3月11日。

点云侠的博客 40万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring Boot中Excel数据导入导出的高效实现

在企业级应用中,Excel文件的导入导出是一个常见的需求。本文将介绍如何在Spring Boot项目中使用EasyExcel库实现Excel文件的导入导出功能。我们将通过实际的代码示例,展示如何读取和写入Excel文件,以及如何通过自定义监听器来增强数据处理的灵活性。

interest_ing_的博客 3433

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring Boot + EasyExcel导入导出,简直太好用了

在EasyExcel执行write方法之后,获得ExcelWriterBuilder类,通过该类的registerWriteHandler方法可以设置一些处理策略。/*** 设置单元格样式(仅用于示例)** @return 样式策略*/// 表头策略// 表头水平对齐居中// 背景色// 自动换行// 内容策略// 设置数据允许的数据格式,这里49代表所有可以都允许设置。

m0_73311735的博客 5336

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot 注解 + 反射优雅地实现Excel导入导出,通用加强版

默认情况下框架使用 JSR-303 Bean Validation 规范定义的校验注解校验,需要手动引入spring-boot-starter-validation ,可通过设置环境变量easyexcel.validator.default.enable=false 关闭。@NotNull(message = "参数不能为空")另外还可以自定义注解对对象校验。

qq_66627105的博客 1683

EasyExcel与Spring Boot集成:打造高效Excel导入导出接口

本文所有示例代码已上传至代码仓库: `https://gitcode.com/gh_mirrors/ea/easyexcel` 包含以下核心模块: - `excel-demo`: 基础导入导出示例 - `excel-advanced`: 自定义转换器和模板导出 - `excel-async`: 异步导出架构实现 - `excel-validator`: 导入数据校验框架 可通过以下命令快速...

gitblog_00278的博客 736

Spring Boot集成EasyExcel实现excel导入导出操作

但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

极客鼠之家 1972

Spring Boot 项目中使用 EasyExcel

Spring Boot 项目中使用 EasyExcel

qq_29527969的博客 1348

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

在企业级应用开发中,常常需要处理复杂的 Excel 表格数据。本方案将 Spring Boot 强大的后端框架与 EasyExcel 这一高效的 Excel 处理工具进行整合,实现了复杂 Excel 表格的导入与导出功能。对于导入功能,能够轻松应对包含多种数据类型、复杂结构以及大量数据的 Excel 文件。通过合理的配置和处理流程,确保数据的准确性和完整性,将 Excel 中的数据快速导入到系统中,为后续的数据处理和业务逻辑提供有力支持。

Yaml4的博客 2603

Spring Boot 中使用EasyExcel实现导入导出

是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。通过这种方式,您可以使用EasyExcel将Excel文件中的数据导入到Java应用程序中,以便进行进一步的处理或使用。========================== 重点来了!===============================EasyExcel的导入功能通常是将Excel文件中的数据导入到程序中,例如Java应用程序。的注解的所有字段都会参与读写,加了。3.2 Service层。

ZeroJcA的博客 2409

MateCloud Excel处理:EasyExcel导入导出高级技巧

MateCloud作为一款基于Spring Cloud Alibaba的微服务架构,其Excel处理功能通过`mate-excel-starter`模块提供了强大的数据导入导出能力。这个starter基于阿里巴巴的EasyExcel库,为开发者提供了简单易用、高性能的Excel处理解决方案。🚀 ## 一、MateCloud Excel Starter的核心优势 MateCloud的Excel

gitblog_00222的博客 671
上一篇: Spring Boot 文件上传与下载(图片 _ Excel)
下一篇: Spring Boot 定时任务与异步处理
码客日记
博客等级 码龄6年 149粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值