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

love.keeping.starter.web.components.excel.ExcelMultipartWriterSheetBuilder Maven / Gradle / Ivy

The newest version!
package love.keeping.starter.web.components.excel;

import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.exception.ExcelGenerateException;
import com.alibaba.excel.write.builder.AbstractExcelWriterParameterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import love.keeping.starter.common.utils.BeanUtil;
import love.keeping.starter.common.utils.CollectionUtil;
import love.keeping.starter.web.utils.ExcelUtil;

import java.util.List;

/**
 * 可分段写入Excel的ExcelWriterSheetBuilder
 *
 * @author Keeping
 */
public class ExcelMultipartWriterSheetBuilder
    extends AbstractExcelWriterParameterBuilder {

  private static final int MAX_ROW_COUNT = 65535;

  private ExcelWriter excelWriter;

  /**
   * Sheet
   */
  private WriteSheet writeSheet;

  /**
   * 行数统计
   */
  private int totalRowCount = 0;

  /**
   * 当前Sheet序号
   */
  private int currentSheetNo = 0;

  /**
   * 最大行数
   */
  private int maxRowCount = MAX_ROW_COUNT;

  public ExcelMultipartWriterSheetBuilder() {

    this.writeSheet = new WriteSheet();
  }

  public ExcelMultipartWriterSheetBuilder(ExcelWriter excelWriter) {

    this.writeSheet = new WriteSheet();
    this.excelWriter = excelWriter;
  }

  /**
   * Starting from 0
   *
   * @param sheetNo
   * @return
   */
  public ExcelMultipartWriterSheetBuilder sheetNo(Integer sheetNo) {

    writeSheet.setSheetNo(sheetNo);
    this.currentSheetNo = sheetNo;
    return this;
  }

  /**
   * sheet name
   *
   * @param sheetName
   * @return
   */
  public ExcelMultipartWriterSheetBuilder sheetName(String sheetName) {

    writeSheet.setSheetName(sheetName);
    return this;
  }

  public WriteSheet build() {

    return writeSheet;
  }

  public int getMaxRowCount() {

    return maxRowCount;
  }

  public void setMaxRowCount(int maxRowCount) {

    this.maxRowCount = maxRowCount;
  }

  public void doWrite(List data) {

    if (excelWriter == null) {
      throw new ExcelGenerateException(
          "Must use 'EasyExcelFactory.write().sheet()' to call this method");
    }
    if (!CollectionUtil.isEmpty(data)) {
      int remainRow = this.maxRowCount - this.totalRowCount;
      if (remainRow < data.size()) {

        if (remainRow > 0) {
          this.doWrite(data.subList(0, remainRow));
          this.nextSheet();
          this.doWrite(data.subList(remainRow, data.size()));
        } else {
          this.nextSheet();
          this.doWrite(data);
        }
      } else {
        //统计行数
        this.totalRowCount += data.size();
        excelWriter.write(data, build());
      }
    } else {
      excelWriter.write(data, build());
    }
  }

  /**
   * 新建Sheet
   */
  public void nextSheet() {
    // 如果超过最大行数,新建Sheet
    this.currentSheetNo++;
    WriteSheet writeSheet = new WriteSheet();
    BeanUtil.copyProperties(this.writeSheet, writeSheet);
    writeSheet.setSheetNo(this.currentSheetNo);
    writeSheet.setSheetName(this.writeSheet.getSheetName() + this.currentSheetNo);
    // 清空CustomWriteHandler
    writeSheet.setCustomWriteHandlerList(ExcelUtil.getWriteHandlers());
    this.writeSheet = writeSheet;
    this.totalRowCount = 0;
  }

  public void finish() {

    if (this.excelWriter != null) {
      this.excelWriter.finish();
    }
  }

  @Override
  protected WriteSheet parameter() {

    return writeSheet;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy