EasyExcel 并不直接支持并发写入,因为 Excel 文件的写入操作本质上是一个顺序操作,不能并发进行。但是,你可以通过并发生成数据,然后顺序写入到 Excel 文件中来提高性能。


以下是一个使用 Java 并发工具 CompletableFuture 来并发生成数据的例子:

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class EasyExcelExportExample {
    static class User {
        private String name;
        private int age;
        // getters and setters
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 文件输出位置
        String fileName = "test.xlsx";
        // 使用 CompletableFuture 并发生成数据
        List<CompletableFuture<List<User>>> futures = IntStream.range(0, 10)
                .mapToObj(i -> CompletableFuture.supplyAsync(() -> generateData(i * 100, 100)))
                .collect(Collectors.toList());
        // 等待所有 CompletableFuture 完成
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get();
        // 收集所有生成的数据
        List<User> userList = futures.stream()
                .map(CompletableFuture::join)
                .flatMap(List::stream)
                .collect(Collectors.toList());
        // 导出 Excel
        EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);
    }
    private static List<User> generateData(int start, int count) {
        return IntStream.range(start, start + count)
                .mapToObj(i -> {
                    User user = new User();
                    user.setName("user" + i);
                    user.setAge(i);
                    return user;
                })
                .collect(Collectors.toList());
    }
}