较大数据量Excel导出工具

较大数据量Excel导出工具

需要提前导入easyexcel包

package com.xinmoren.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import lombok.Builder;
import lombok.Data;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class ExportExcel {
    /**
     * 一次最大写入数量
     */
    private static final Integer ONCE_WRITE_MAX = 3000;

    /**
     * 默认sheetNo
     */
    private static final Integer DEFAULT_SHEET_NO = 0;

    /**
     * 默认sheetName
     */
    private static final String DEFAULT_SHEET_NAME = "sheet1";

    @FunctionalInterface
    public interface GetData<N extends Number, N extends Number, T extends Collection> {
        R get(N page, N size);
    }

    @Data
    @Builder
    public static class Param {
        /**
         * 数据类
         */
        private Class dataClass;

        /**
         * 一次写出多少行数据
         */
        private Integer onceWriteNum;

        /**
         * 获取数据方法
         */
        private GetData function;

        /**
         * 输出流
         */
        private OutputStream outputStream;
    }

    public static void exportExcel(Param param) {
        ExcelWriter excelWriter = EasyExcel.write(param.getOutputStream()).autoCloseStream(Boolean.FALSE).build();
        WriteSheet writeSheet = EasyExcel.writerSheet(DEFAULT_SHEET_NO, DEFAULT_SHEET_NAME).head(param.getDataClass())
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
        if (param.getOnceWriteNum() > ONCE_WRITE_MAX) {
            param.setOnceWriteNum(ONCE_WRITE_MAX);
        }
        int page = 1;
        Collection collection = param.function.get(page, param.getOnceWriteNum());
        while (collection != null && collection.size() > 0) {
            excelWriter.write(Arrays.asList(collection), writeSheet);
            if (collection.size() != param.getOnceWriteNum()) {
                break;
            }
            collection = param.function.get(page++, param.getOnceWriteNum());
        }
        excelWriter.finish();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值