Java 使用 Easy Excel 进行 Excel 数据导入导出

发布于:2025-06-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

1. 通过 Maven 下载 Easy Excel 依赖包

在项目的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version> <!-- 使用最新版本 -->
</dependency>

<!-- 如果使用 Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

maven下载依赖包详情见文章:https://blog.csdn.net/Y1_again_0_again/article/details/148828971?spm=1011.2124.3001.6209

2. 创建 Excel 对应的实体类

根据Excel表格的列名(如"姓名")和数据类型(如字符串类型),创建对应的Java类来映射表格结构。

使用 Lombok 插件快速创建实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data // 自动添加 get&set 方法、toString 方法
@AllArgsConstructor // 自动添加有参构造方法
@NoArgsConstructor // 自动添加无参构造方法
public class UserData {
    
    @ExcelProperty("用户ID") // 对应 Excel 表头
    private Integer id;
    
    @ExcelProperty("用户名")
    private String username;
    
    @ExcelProperty("年龄")
    private Integer age;
    
    @ExcelProperty("邮箱")
    private String email;
    
    @ExcelProperty("注册时间")
    private Date registerTime;
}

3. Excel 数据读取

执行 Excel 数据读取并输出结果:

List<StudentsData> students = EasyExcel.read("D:\\Users\\1\\IdeaProjects\\Test_Java_Maven\\src\\test\\resources\\test.xlsx").head(UserData.class).sheet(0).doReadSync();
System.out.println(students);

基本读取方法

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;

public class ExcelReader {
    public static void main(String[] args) {
        // 文件路径
        String fileName = "user_data.xlsx";
        
        // 读取 Excel 文件
        EasyExcel.read(fileName, UserData.class, new PageReadListener<UserData>(dataList -> {
            // 每次读取 100 条数据会保存一次,处理读取到的数据
            for (UserData user : dataList) {
                System.out.println("读取到数据: " + user);
                // 这里可以添加业务逻辑,如保存到数据库
            }
        })).sheet().doRead();
    }
}

自定义读取监听器(更灵活)

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;

public class UserDataListener implements ReadListener<UserData> {
    @Override
    public void invoke(UserData data, AnalysisContext context) {
        // 逐行读取数据
        System.out.println("解析到一条数据: " + data);
        // 业务处理...
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("所有数据解析完成");
    }
}

// 使用自定义监听器
EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();

4. 写入 Excel 数据

基本写入方法

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ExcelWriter {
    public static void main(String[] args) {
        // 文件路径
        String fileName = "output_user_data.xlsx";
        
        // 模拟数据
        List<UserData> dataList = new ArrayList<>();
        dataList.add(new UserData(1, "张三", 25, "zhangsan@example.com", new Date()));
        dataList.add(new UserData(2, "李四", 30, "lisi@example.com", new Date()));
        dataList.add(new UserData(3, "王五", 28, "wangwu@example.com", new Date()));
        
        // 写入 Excel
        EasyExcel.write(fileName, UserData.class)
                .sheet("用户数据") // 工作表名称
                .doWrite(dataList);
    }
}

复杂写入示例(设置表头、样式等)

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.IndexedColors;

public class AdvancedExcelWriter {
    public static void main(String[] args) {
        String fileName = "advanced_user_data.xlsx";
        
        // 设置表头样式
        WriteCellStyle headStyle = new WriteCellStyle();
        headStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); // 蓝色背景
        // 设置内容样式
        WriteCellStyle contentStyle = new WriteCellStyle();
        contentStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 浅灰色背景
        
        HorizontalCellStyleStrategy styleStrategy = 
            new HorizontalCellStyleStrategy(headStyle, contentStyle);
        
        EasyExcel.write(fileName, UserData.class)
                .registerWriteHandler(styleStrategy) // 注册样式策略
                .sheet("高级用户数据")
                .doWrite(DataGenerator.generateUserData());
    }
}

5. 实际应用场景示例

批量导入用户数据到数据库

import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Service;

@Service
public class UserImportService {
    
    @Autowired
    private UserRepository userRepository;
    
    public void importUsersFromExcel(String filePath) {
        EasyExcel.read(filePath, UserData.class, new ReadListener<UserData>() {
            // 每读取100条保存一次
            private static final int BATCH_SIZE = 100;
            private List<UserData> cachedDataList = new ArrayList<>(BATCH_SIZE);
            
            @Override
            public void invoke(UserData userData, AnalysisContext analysisContext) {
                cachedDataList.add(userData);
                if (cachedDataList.size() >= BATCH_SIZE) {
                    saveData();
                    cachedDataList = new ArrayList<>(BATCH_SIZE);
                }
            }
            
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                saveData();
            }
            
            private void saveData() {
                if (!cachedDataList.isEmpty()) {
                    userRepository.saveAll(cachedDataList.stream()
                        .map(this::convertToEntity)
                        .collect(Collectors.toList()));
                }
            }
            
            private User convertToEntity(UserData userData) {
                User user = new User();
                user.setUsername(userData.getUsername());
                user.setAge(userData.getAge());
                user.setEmail(userData.getEmail());
                return user;
            }
        }).sheet().doRead();
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到