diff --git a/src/main/java/cokr/xit/base/file/xls/XLSWriter.java b/src/main/java/cokr/xit/base/file/xls/XLSWriter.java index 5dec4be..0d3292b 100644 --- a/src/main/java/cokr/xit/base/file/xls/XLSWriter.java +++ b/src/main/java/cokr/xit/base/file/xls/XLSWriter.java @@ -5,14 +5,11 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.CellStyle; @@ -474,19 +471,6 @@ public class XLSWriter extends XLS { return cellStyle(new Styler().dataFormat("HH:mm:ss").merge(Styler.CENTER)); } - public List header(Iterable defs, Supplier factory) { - ArrayList result = new ArrayList<>(); - - for (CellDef def: defs) { - result.add(def.label); - Styler styler = factory.get(); - styler.width(def.width); - result.add(styler); - } - - return result; - } - /**셀스타일 정보. {@link #set(CellStyle) CellStyle을 설정}하는데 사용. * @author mjkhan */ @@ -810,31 +794,122 @@ public class XLSWriter extends XLS { } } - /** + /**셀 값과 스타일 설정에 대한 정의 * @author mjkhan */ public static class CellDef { - public static final Map toMap(CellDef... defs) { - return Stream.of(defs).collect(Collectors.toMap( - def -> def.label, - def -> def, - (k1, k2) -> k1, - LinkedHashMap::new - )); + /**valueMap에서 CellDef의 필드이름 또는 스타일을 설정한다. + * @param defs CellDef 목록 + * @param valueMap 레이블별 필드이름 또는 스타일 + */ + public static void setValues(List defs, Map valueMap) { + defs.forEach(def -> { + Object val = valueMap.get(def.label); + if (val == null) + val = def.field; + if (isEmpty(val)) + throw new RuntimeException("Value or style not found for " + def.label); + + def.value = val; + }); + } + + /**CellDef 목록에서 셀헤더 이름과 스타일을 반환한다. + * @param defs CellDef 목록 + * @param factory 헤더 스타일을 제공하는 function + * @return 셀헤더 이름과 스타일 목록 + */ + public static List header(List defs, Supplier factory) { + ArrayList result = new ArrayList<>(); + + for (CellDef def: defs) { + result.add(def.label); + + Styler styler = factory.get(); + styler.width(def.width); + result.add(styler); + } + + return result; } - private String label; + /**CellDef 목록에서 셀값의 필드이름 또는 스타일 목록을 반환한다. + * @param defs CellDef 목록 + * @return 셀값의 필드이름 또는 스타일 목록 + */ + public static Object[] values(List defs) { + return defs.stream().map(CellDef::getValue).toList().toArray(); + } + + private String + label, + field; private int width; private Object value; - public CellDef(String label, int width, Object value) { + /**레이블을 반환한다. + * @return 레이블 + */ + public String getLabel() { + return label; + } + + /**레이블을 설정한다. + * @param label 레이블 + * @return 현재 CellDef + */ + public CellDef setLabel(String label) { this.label = label; + return this; + } + + /**필드이름을 반환한다. + * @return 필드이름 + */ + public String getField() { + return field; + } + + /**필드이름을 설정한다. + * @param field 필드이름 + * @return 현재 CellDef + */ + public CellDef setField(String field) { + this.field = field; + return this; + } + + /**넓이를 반환한다. + * @return 넓이 + * @return 현재 CellDef + */ + public int getWidth() { + return width; + } + + /**넓이를 설정한다. + * @param width 넓이 + * @return 현재 CellDef + */ + public CellDef setWidth(int width) { this.width = width; - this.value = value; + return this; } + /**필드이름, 또는 스타일을 반환한다. + * @return 필드이름, 또는 스타일 + */ public Object getValue() { return value; } + + /**필드이름, 또는 스타일을 설정한다. + * @param value 필드이름, 또는 스타일 + * @return 현재 CellDef + */ + public CellDef setValue(Object value) { + this.value = value; + return this; + } } } \ No newline at end of file