package com.alibaba.excel;

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

import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.ExcelBuilder;
import com.alibaba.excel.write.ExcelBuilderImpl;

/**
 * 生成excel,thread unsafe
 *
 * @author jipengfei
 */
public class ExcelWriter {

    private ExcelBuilder excelBuilder;

    /**
     * 生成EXCEL
     *
     * @param outputStream 文件输出流
     * @param typeEnum     输出文件类型03或07,强烈建议使用07版(可以输出超大excel而不内存溢出)
     */
    public ExcelWriter(OutputStream outputStream, ExcelTypeEnum typeEnum) {
        this(outputStream, typeEnum, true);
    }

    /**
     * 生成EXCEL
     *
     * @param outputStream 文件输出流
     * @param typeEnum     输出文件类型03或07,强烈建议使用07版(可以输出超大excel而不内存溢出)
     * @param needHead 是否需要表头
     */
    public ExcelWriter(OutputStream outputStream, ExcelTypeEnum typeEnum, boolean needHead) {
        excelBuilder = new ExcelBuilderImpl();
        excelBuilder.init(outputStream, typeEnum, needHead);
    }

    /**
     * 生成多sheet,每个sheet一张表
     *
     * @param data  一行数据是一个BaseRowModel子类的模型
     * @param sheet data写入某个sheet
     * @return this(当前引用)
     */
    public ExcelWriter write(List<? extends BaseRowModel> data, Sheet sheet) {
        excelBuilder.addContent(data, sheet);
        return this;
    }

    /**
     * 生成多sheet,每个sheet一张表
     *
     * @param data  List代表一行数据
     * @param sheet data写入某个sheet
     * @return this(当前引用)
     */
    public ExcelWriter write0(List<List<String>> data, Sheet sheet) {
        excelBuilder.addContent(data, sheet);
        return this;
    }

    /**
     * 可生成多sheet,每个sheet多张表
     *
     * @param data  type 一个java模型一行数据
     * @param sheet data写入某个sheet
     * @param table data写入某个table
     * @return this(当前引用)
     */
    public ExcelWriter write(List<? extends BaseRowModel> data, Sheet sheet, Table table) {
        excelBuilder.addContent(data, sheet, table);
        return this;
    }

    /**
     * 可生成多sheet,每个sheet多张表
     *
     * @param data  List 代表一行数据
     * @param sheet data写入某个sheet
     * @param table data写入某个table
     * @return this(当前引用)
     */
    public ExcelWriter write0(List<List<String>> data, Sheet sheet, Table table) {
        excelBuilder.addContent(data, sheet, table);
        return this;
    }

    public void finish() {
        excelBuilder.finish();
    }
}