package com.brightgenerous.poi.writer;
import static com.brightgenerous.commons.ObjectUtils.*;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import com.brightgenerous.poi.CellStyleRegister;
import com.brightgenerous.poi.FormatterRegister;
public class WorkbookWriterBuilder {
// static default
private static final String DEFAULT_EMPTY_SHEET_NAME = "sheet";
private static final ISheetWriter DEFAULT_EMPTY_SHEET_WRITER = new AbstractSheetWriter() {
@Override
public void write(Workbook workbook, int index, Sheet sheet, CellStyleRegister register) {
}
};
private static final Boolean DEFAULT_EMPTY_CONVERT_TO_STRING = Boolean.FALSE;
private static final Boolean DEFAULT_USE_TEMPLATE_FLAG = Boolean.TRUE;
private static final TemplateLoader DEFAULT_TEMPLATE_LOADER = new DefaultTemplateLoader();
private static final FormatterRegister DEFAULT_EMPTY_FORMATTER_REGISTER = new FormatterRegister() {
@Override
public boolean isNumberFormat(String str) {
return false;
}
@Override
public boolean isDateFormat(String str) {
return false;
}
@Override
public NumberFormat getNumberFormat(String str) {
return null;
}
@Override
public DateFormat getDateFormat(String str) {
return null;
}
};
private static final Boolean DEFAULT_XLSX_FLAG = Boolean.FALSE;
// specify
private String emptySheetName;
private ISheetWriter emptySheetWriter;
private Boolean emptyConvertToString;
private FormatterRegister emptyFormatterRegister;
private Boolean xlsxFlag;
private Boolean useTemplateFlag;
private TemplateLoader templateLoader;
private String defaultSheetName;
private ISheetWriter defaultSheetWriter;
private Boolean defaultConvertToString;
private FormatterRegister defaultFormatterRegister;
private final List<SheetStrategyHolder> sheetStrategyHolders = new ArrayList<>();
protected WorkbookWriterBuilder() {
}
public static WorkbookWriterBuilder create() {
return new WorkbookWriterBuilder();
}
public WorkbookWriterBuilder clear() {
emptySheetName = null;
emptySheetWriter = null;
emptyConvertToString = null;
emptyFormatterRegister = null;
xlsxFlag = null;
useTemplateFlag = null;
templateLoader = null;
defaultSheetName = null;
defaultSheetWriter = null;
defaultConvertToString = null;
defaultFormatterRegister = null;
sheetStrategyHolders.clear();
return this;
}
public String emptySheetName() {
return emptySheetName;
}
public WorkbookWriterBuilder emptySheetName(String sheetName) {
emptySheetName = sheetName;
return this;
}
public ISheetWriter emptySheetWriter() {
return emptySheetWriter;
}
public WorkbookWriterBuilder emptySheetWriter(ISheetWriter sheetWriter) {
emptySheetWriter = sheetWriter;
return this;
}
public Boolean emptyConvertToString() {
return emptyConvertToString;
}
public WorkbookWriterBuilder emptyConvertToString(Boolean convertToString) {
emptyConvertToString = convertToString;
return this;
}
public FormatterRegister emptyFormatterRegister() {
return emptyFormatterRegister;
}
public WorkbookWriterBuilder emptyFormatterRegister(FormatterRegister formatterRegister) {
emptyFormatterRegister = formatterRegister;
return this;
}
public Boolean xlsxFlag() {
return xlsxFlag;
}
public WorkbookWriterBuilder xlsxFlag(Boolean xlsxFlag) {
this.xlsxFlag = xlsxFlag;
return this;
}
public Boolean useTemplateFlag() {
return useTemplateFlag;
}
public WorkbookWriterBuilder useTemplateFlag(Boolean useTemplateFlag) {
this.useTemplateFlag = useTemplateFlag;
return this;
}
public TemplateLoader templateLoader() {
return templateLoader;
}
public WorkbookWriterBuilder templateLoader(TemplateLoader templateLoader) {
return templateLoader(templateLoader, true);
}
public WorkbookWriterBuilder templateLoader(TemplateLoader templateLoader, boolean use) {
this.templateLoader = templateLoader;
useTemplateFlag = use ? Boolean.TRUE : Boolean.FALSE;
return this;
}
public WorkbookWriterBuilder defaultSheetName(String sheetName) {
defaultSheetName = sheetName;
return this;
}
public WorkbookWriterBuilder defaultSheetWriter(ISheetWriter sheetWriter) {
defaultSheetWriter = sheetWriter;
return this;
}
public WorkbookWriterBuilder defaultConvetToString(Boolean convertToString) {
defaultConvertToString = convertToString;
return this;
}
public FormatterRegister defaultFormatterRegister() {
return defaultFormatterRegister;
}
public WorkbookWriterBuilder defaultFormatterRegister(FormatterRegister formatterRegister) {
defaultFormatterRegister = formatterRegister;
return this;
}
public int sheets() {
return sheetStrategyHolders.size();
}
public WorkbookWriterBuilder addSheet() {
return addSheet((String) null);
}
public WorkbookWriterBuilder addSheet(String sheetName) {
return addSheet(sheetName, null);
}
public WorkbookWriterBuilder addSheet(ISheetWriter sheetWriter) {
return addSheet(null, sheetWriter);
}
public WorkbookWriterBuilder addSheet(String sheetName, ISheetWriter sheetWriter) {
return addSheet(sheetName, sheetWriter, null);
}
public WorkbookWriterBuilder addSheet(String sheetName, ISheetWriter sheetWriter,
Boolean convertToString) {
return addSheet(sheetName, sheetWriter, convertToString, null);
}
public WorkbookWriterBuilder addSheet(String sheetName, ISheetWriter sheetWriter,
Boolean convertToString, FormatterRegister formatterRegister) {
SheetStrategyHolder sheetStrategyHolder = new SheetStrategyHolder();
sheetStrategyHolder.sheetName = sheetName;
sheetStrategyHolder.sheetWriter = sheetWriter;
sheetStrategyHolder.convertToString = convertToString;
sheetStrategyHolder.formatterRegister = formatterRegister;
sheetStrategyHolders.add(sheetStrategyHolder);
return this;
}
protected List<ISheetWriterStrategy> getSheetStrategys() {
List<ISheetWriterStrategy> sheets = new ArrayList<>();
for (SheetStrategyHolder holder : sheetStrategyHolders) {
sheets.add(new SheetWriterStrategy(defaultIfNull(holder.sheetName, defaultSheetName,
emptySheetName, DEFAULT_EMPTY_SHEET_NAME), defaultIfNull(holder.sheetWriter,
defaultSheetWriter, emptySheetWriter, DEFAULT_EMPTY_SHEET_WRITER),
defaultIfNull(holder.convertToString, defaultConvertToString,
emptyConvertToString, DEFAULT_EMPTY_CONVERT_TO_STRING).booleanValue(),
defaultIfNull(holder.formatterRegister, defaultFormatterRegister,
emptyFormatterRegister, DEFAULT_EMPTY_FORMATTER_REGISTER)));
}
return sheets;
}
protected ISheetWriterStrategy getEmptySheetStrategy() {
return new SheetWriterStrategy(defaultIfNull(emptySheetName, DEFAULT_EMPTY_SHEET_NAME),
defaultIfNull(emptySheetWriter, DEFAULT_EMPTY_SHEET_WRITER), defaultIfNull(
emptyConvertToString, DEFAULT_EMPTY_CONVERT_TO_STRING).booleanValue(),
defaultIfNull(emptyFormatterRegister, DEFAULT_EMPTY_FORMATTER_REGISTER));
}
public IWorkbookWriter build() {
return newWorkbookWriter(
new WorkbookWriterStrategy(getSheetStrategys(), getEmptySheetStrategy(),
defaultIfNull(xlsxFlag, DEFAULT_XLSX_FLAG).booleanValue()),
defaultIfNull(useTemplateFlag, DEFAULT_USE_TEMPLATE_FLAG).booleanValue() ? defaultIfNull(
templateLoader, DEFAULT_TEMPLATE_LOADER) : null);
}
protected IWorkbookWriter newWorkbookWriter(IWorkbookWriterStrategy strategy,
TemplateLoader templateLoader) {
return new WorkbookWriter(strategy, templateLoader);
}
protected static class SheetStrategyHolder {
String sheetName;
ISheetWriter sheetWriter;
Boolean convertToString;
FormatterRegister formatterRegister;
}
}