easyexcel多线程写入

EasyExcel是一款非常优秀的Java Excel操作库,支持快速读取、写入和处理Excel文件。如果需要在写入Excel文件时提高性能,可以使用多线程进行并发写入。下面是一个使用EasyExcel进行多线程写入Excel文件的示例:

public class MultiThreadWriteExcelDemo {
    public static void main(String[] args) {
        // 模拟数据
        List<List<Object>> dataList = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            List<Object> data = new ArrayList<>();
            data.add("张三" + i);
            data.add("男");
            data.add(18 + i);
            dataList.add(data);
        // 创建一个写入Excel文件的回调
        WriteHandler writeHandler = new ExcelWriteHandler();
        // 创建一个写入Excel文件的上下文
        WriteContext writeContext = EasyExcel.write()
                .file("demo.xlsx")
                .head(Arrays.asList("姓名", "性别", "年龄"))
                .registerWriteHandler(writeHandler)
                .buildContext();
        // 创建一个写入Excel文件的任务列表
        List<CompletableFuture<Void>> taskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            int startIndex = i * 1000;
            int endIndex = (i + 1) * 1000 - 1;
            List<List<Object>> subDataList = dataList.subList(startIndex, endIndex);
            CompletableFuture<Void> task = CompletableFuture.runAsync(() -> {
                // 执行写入Excel文件的操作
                writeContext.write(subDataList);
            taskList.add(task);
        // 等待所有任务完成
        CompletableFuture.allOf(taskList.toArray(new CompletableFuture[0])).join();
        // 关闭上下文
        writeContext.finish();
    private static class ExcelWriteHandler extends AbstractSheetWriteHandler {
        private List<List<Object>> dataList = new ArrayList<>();
        @Override
        public void beforeSheetCreate(WriteHandlerContext context, WriteSheetHolder writeSheetHolder) {
            // 在创建新的Sheet之前,清空数据列表
            dataList.clear();
        @Override
        public void afterSheetCreate(WriteHandlerContext context, WriteSheetHolder writeSheetHolder) {
            // 在Sheet创建完成之后,将数据写入Sheet中
            writeSheetHolder.getSheet().setClazz(List.class);
            writeSheetHolder.getSheet().setAutoWidth(true);
            context.buildWriteHolder().excelWriteHeadProperty().setHeadRowNumber(0);
            context.currentWriteHolder().write(dataList, context.buildWriteHolder().excelWriteHeadProperty().getHead());
        @Override
        public void row(WriteHandlerContext context, WriteRowHolder writeRowHolder) {
            // 在写入每一行数据时,将数据添加到数据列表中
            dataList.add(writeRowHolder.getRow().get(0).getDatas());

这个示例中,我们将10000条数据拆分为10个子列表,每个子列表包含1000条数据。然后,我们创建了10个异步任务,每个任务负责写入一个子列表的数据到Excel文件中。通过这种方式,我们可以在不阻塞主线程的情况下,并发地写入Excel文件,提高写入性能。

  •