All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.thomas.alib.excel.exporter.ExcelExporterBase Maven / Gradle / Ivy

Go to download

简单excel导入导出工具,基于Apache.poi实现,通过注解方式实现poi常用api的调用

The newest version!
package com.thomas.alib.excel.exporter;


import com.thomas.alib.excel.utils.CollectionUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel导出者基类,主要负责处理输出流和poi之间的交互
 *
 * @param  子类泛型,用于链式调用
 */
public abstract class ExcelExporterBase> {
    protected static Logger logger = LoggerFactory.getLogger(ExcelExporterBase.class);
    protected SXSSFWorkbook sxssfWorkbook;
    protected List> sheetItemList;
    protected ExcelExportSheetItem currentSheetItem;
    protected C child;

    /**
     * 构造方法
     */
    protected ExcelExporterBase() {
        this.sxssfWorkbook = new SXSSFWorkbook();
        this.sheetItemList = new ArrayList<>();
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list 数据源列表
     * @param        数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C addSheet(List data_list) {
        return addSheet(data_list, null);
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list  数据源列表
     * @param show_index 是否显示序号
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C addSheet(List data_list, Boolean show_index) {
        return addSheet(data_list, show_index, null);
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list  数据源列表
     * @param show_index 是否显示序号
     * @param sheet_name 指定sheet名称
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C addSheet(List data_list, Boolean show_index, String sheet_name) {
        //空数据不操作
        if (CollectionUtils.isEmpty(data_list)) return child;
        //获取数据类型
        Class data_clazz = null;
        for (T item : data_list) {
            if (item != null) {
                try {
                    data_clazz = (Class) item.getClass();
                    break;
                } catch (Throwable ignored) {
                }
            }
        }
        return createSheet(data_list, data_clazz, show_index, sheet_name);
    }

    /**
     * 添加一个仅有表头的空sheet
     *
     * @param data_clazz 数据源类型
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createEmptySheet(Class data_clazz) {
        return createSheet(null, data_clazz);
    }

    /**
     * 添加一个仅有表头的空sheet
     *
     * @param data_clazz 数据源类型
     * @param show_index 是否显示序号
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createEmptySheet(Class data_clazz, Boolean show_index) {
        return createSheet(null, data_clazz, show_index);
    }

    /**
     * 添加一个仅有表头的空sheet
     *
     * @param data_clazz 数据源类型
     * @param show_index 是否显示序号
     * @param sheet_name 指定sheet名称
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createEmptySheet(Class data_clazz, Boolean show_index, String sheet_name) {
        return createSheet(null, data_clazz, show_index, sheet_name);
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list  数据源列表
     * @param data_clazz 数据源类型
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createSheet(List data_list, Class data_clazz) {
        return createSheet(data_list, data_clazz, null);
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list  数据源列表
     * @param data_clazz 数据源类型
     * @param show_index 是否显示序号
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createSheet(List data_list, Class data_clazz, Boolean show_index) {
        return createSheet(data_list, data_clazz, show_index, null);
    }

    /**
     * 添加一个列表,作为一个sheet
     *
     * @param data_list  数据源列表
     * @param data_clazz 数据源类型
     * @param show_index 是否显示序号
     * @param sheet_name 指定sheet名称
     * @param         数据类型泛型
     * @return 链式调用,返回自身
     */
    public  C createSheet(List data_list, Class data_clazz, Boolean show_index, String sheet_name) {
        currentSheetItem = new ExcelExportSheetItem<>(child, data_list, data_clazz, show_index, sheet_name);
        currentSheetItem.writeData();
        sheetItemList.add(currentSheetItem);
        return child;
    }

    /**
     * 取得当前创建的sheet页签对象,可以调用sheet中的某些方法
     * (目前暂无实际业务场景,为未来扩展预留的方法)
     *
     * @return 当前创建的sheet页签对象
     */
    public ExcelExportSheetItem currentSheet() {
        return currentSheetItem;
    }

    /**
     * 由子类提供具体导出的输出流
     *
     * @return 输出流对象
     * @throws Exception 创建输出流时可能产生的异常,子类可直接抛出,由父类处理
     */
    protected abstract OutputStream getOutputStream() throws Exception;

    /**
     * 开始生成并输出返回,导出后将自动销毁
     */
    public void export() {
        export(true);
    }

    /**
     * 开始生成并输出返回
     *
     * @param auto_destroy 是否自动销毁
     */
    public void export(boolean auto_destroy) {
        if (CollectionUtils.isEmpty(sheetItemList))
            throw new RuntimeException("导出数据为空");
        logger.debug("导出数据处理完毕,开始输出到指定的流中。");
        OutputStream os = null;
        try {
            os = getOutputStream();
            sxssfWorkbook.write(os);
        } catch (Exception e) {
            throw new RuntimeException("导出失败", e);
        } finally {
            try {
                if (os != null) {
                    os.flush();
                    os.close();
                }
            } catch (IOException e) {
                logger.error("表格export关闭输出流时发生错误:", e);
            }
            if (auto_destroy) destroy();
            logger.debug("导出数据输出完毕。");
        }
    }

    /**
     * 销毁
     */
    public void destroy() {
        try {
            sxssfWorkbook.close();
        } catch (Throwable e) {
            logger.error("表格关闭Workbook时发生错误:", e);
        }
        sxssfWorkbook = null;
        sheetItemList.forEach(ExcelExportSheetItem::close);
        sheetItemList.clear();
        sheetItemList = null;
        currentSheetItem = null;
        child = null;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy