使用EasyExcel读取和导出Excel文件

目录

引言

一、环境准备

二、编写通用导入、导出工具类

三、创建实体对象

四、示例方法

五、总结


引言

在Java开发中,读取和导出Excel文件是一个常见的需求。阿里巴巴的 EasyExcel 库提供了一种高效、简单的方式来处理Excel文件。EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

本文将通过一个示例代码详细介绍如何使用 EasyExcel 读取Excel文件中的数据并导出数据到Excel文件。

官方网址:
EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

一、环境准备

        <!-- https://github.com/alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>4.0.3</version>
        </dependency>

二、编写通用导入、导出工具类

通用化的方法,适用于任意文件对象实体

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.study.server.easyExcel.converter.ExcelImportValid;
import com.study.server.web.exception.BaseException;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * EasyExcel工具类
 *
 * @author CWW
 * @date 2024/12/18 16:46
 */
public class EasyExcelUtil {

    private static final String UTF_8 = "UTF-8";

    /**
     * 读取文件数据,并返回一个包含指定类型数据的列表。
     *
     * @param inputStream 文件对象输入流
     * @param clazz       数据对象的类型
     * @param <T>         泛型类型,表示数据对象的类型
     * @return 包含解析后数据对象的列表
     */
    public static <T> List<T> readMultipartFile(InputStream inputStream, Class<T> clazz) {
        // 用于存储解析后的数据对象
        final List<T> dataList = new ArrayList<>();

        EasyExcel.read(inputStream, clazz, new AnalysisEventListener<T>() {
            @Override
            public void invoke(T data, AnalysisContext analysisContext) {
                // 每一条数据解析都会调用此方法
                // 将解析后的数据对象添加到 dataList中
                dataList.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                // 读取完成后可以进行一些操作
            }
        }).sheet().doRead(); // 读取 Excel 文件中的第一个工作表

        // 返回解析后数据对象的列表
        return dataList;
    }

    /**
     * 导出 Excel文件
     *
     * @param response  HTTP 响应对象
     * @param fileName  文件名,用于在客户端保存文件时显示
     * @param sheetName 工作表名,Excel 文件中的工作表名称
     * @param list      要导出的数据列表
     * @param clazz     实体类的类对象,用于定义 Excel 文件的结构
     * @param <T>       数据列表的元素类型
     */
    public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> list, Class<T> clazz) {
        try {
            // 设置响应内容类型为 Excel 文件
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            // 设置响应字符编码
            response.setCharacterEncoding(UTF_8);

            // 使用 URLEncoder 编码文件名,防止中文乱码
            // replaceAll("\\+", "%20") 用于将空格编码为 %20,而不是 + 号
            String fileNameEncode = URLEncoder.encode(fileName, UTF_8).replaceAll("\\+", "%20");

            // 设置响应头,告诉浏览器这是一个附件
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameEncode + ".xlsx");

            // 使用 EasyExcel 写入数据到响应的输出流
            // clazz 参数用于指定 Excel 文件的结构类
            // sheetName 参数用于指定 Excel 文件中的工作表名称
            EasyExcel.write(response.getOutputStream(), clazz)
                    .sheet(sheetName)
                    .doWrite(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、创建实体对象

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;

/**
 * 用户导入文件实体
 *
 * @author CWW
 * 2024/12/18 16:46
 */
@Data
@HeadRowHeight(20) // 头高
@ContentRowHeight(15) // 行高
@ColumnWidth(15) // 列宽
public class UserFileDataVO {

    @ExcelProperty(value = "姓名")
    private String userName;

    @ExcelProperty(value = "手机")
    private String phoneNumber;

}

四、示例方法

import com.server.common.model.ResponseResultUtil;
import com.server.common.model.ResponseResultVO;
import com.server.easyExcel.util.EasyExcelUtil;
import com.server.easyExcel.mode.UserFileDataVO;
import com.server.file.mapper.FileExportMapper;
import com.server.web.exception.BaseException;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 文件导入导出控制层

 * @author CWW
 * @date 2024/12/18 11:42
 */
@Validated
@RestController
@RequestMapping("/easy/excel")
public class FileController {

    /**
     * 文件导入
     *
     * @param file excel文件
     * @return 执行结果
     */
    @PostMapping("/upload")
    public ResponseResultVO readFile1(MultipartFile file) {
        // 定义一个接收表格内容的集合
        List<UserFileDataVO> list;
        // 读取文件内容
        try {
            list = EasyExcelUtil.readMultipartFile(file.getInputStream(), UserFileDataVO.class);
        } catch (Exception e) {
            throw new BaseException(e.getMessage());
        }

        System.out.println(list.size());
        return ResponseResultUtil.success();
    }

    @Resource
    private FileExportMapper fileExportMapper;

    /**
     * 导出excel文件
     *
     * @param response 响应体
     */
    @PostMapping("/download1")
    public void downFile1(HttpServletResponse response) {
        // 获取用户信息列表
        List<UserFileDataVO> userList = fileExportMapper.getUserList();
        // 导出文件
        EasyExcelUtil.export(response, "用户名单", "用户名单", userList, UserFileDataVO.class);
    }

}

五、总结

  • 读取Excel文件:使用 EasyExcel.read 方法读取文件,并通过 AnalysisEventListener 处理每一行的数据。
  • 导出Excel文件:使用 EasyExcel.write 方法将数据写入到响应的输出流中,并设置正确的响应头。

希望这篇教学文章对你有所帮助。如果有任何问题或需要进一步的帮助,欢迎随时评论交流。

### 使用 EasyExcel 实现数据导出 为了实现在 Spring Boot 应用中使用 EasyExcel 导出数据的功能,可以按照如下方法操作: #### 1. 添加 Maven 依赖 首先,在项目的 `pom.xml` 文件中加入 EasyExcel 的依赖项[^2]。 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>最新版本号</version> </dependency> ``` #### 2. 创建 Excel 数据模型类 定义一个 Java 类作为要导出的数据模板。此对象应包含与目标表格列相对应的字段,并标注相应的注解以便于映射到 Excel 表格中的各列上。 ```java import com.alibaba.excel.annotation.ExcelProperty; public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; } ``` #### 3. 编写控制器逻辑 编写用于响应 HTTP 请求并返回下载流的服务端代码片段。这里假设有一个名为 `/exportUserList` 的 API 接口用来触发导出动作。 ```java import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/api/v1/excel") public class UserController { @GetMapping("/exportUserList") public void export(HttpServletResponse response) throws IOException { // 设置HTTP请求头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); List<User> userList = new ArrayList<>(); // 填充列表... // 调用EasyExcel.write() 方法执行实际的写出过程 EasyExcel.write(response.getOutputStream(), User.class).sheet("用户").doWrite(userList); } } ``` 上述例子展示了如何配置好环境之后利用 EasyExcel 提供的简便接口轻松完成一次简单的数据导出任务。对于更复杂的需求场景,则可能还需要进一步调整参数选项或者自定义样式等内容[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值