|
|
@ -4,8 +4,11 @@ import java.io.File;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
import java.util.function.UnaryOperator;
|
|
|
|
|
|
|
|
import java.util.stream.IntStream;
|
|
|
|
|
|
|
|
|
|
|
|
import org.apache.poi.ss.usermodel.CellStyle;
|
|
|
|
import org.apache.poi.ss.usermodel.CellStyle;
|
|
|
|
|
|
|
|
import org.apache.poi.ss.usermodel.Font;
|
|
|
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
|
|
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
|
|
|
|
|
|
@ -21,183 +24,205 @@ public class XLSTest {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
void sxssf() {
|
|
|
|
void write() {
|
|
|
|
XLSWriter xlsx = new XLSWriter().worksheet("테스트 시트");
|
|
|
|
XLSWriter xlsx = new XLSWriter().worksheet(0).trackWidth(0, 1, 2, 3);
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
CellStyle
|
|
|
|
CellStyle
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
numeric = format.n_nn0(),
|
|
|
|
numeric = format.n_nn0(),
|
|
|
|
blue = format.cellStyle(new Style().foregroundColor(IndexedColors.LIGHT_BLUE.getIndex()));
|
|
|
|
blue = format.cellStyle(new Style()
|
|
|
|
|
|
|
|
.foregroundColor(IndexedColors.LIGHT_BLUE.getIndex())
|
|
|
|
|
|
|
|
.configure(style -> {
|
|
|
|
|
|
|
|
Font font = format.font();
|
|
|
|
|
|
|
|
font.setColor(IndexedColors.WHITE.getIndex());
|
|
|
|
|
|
|
|
style.font(font);
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.row(0)
|
|
|
|
Date now = new Date();
|
|
|
|
.col(0).value("테스트0")
|
|
|
|
|
|
|
|
.col(1).value("테스트1")
|
|
|
|
|
|
|
|
.col(2).value(new Date()).value(datetime)
|
|
|
|
|
|
|
|
.col(3).value(1000000.0101).value(numeric)
|
|
|
|
|
|
|
|
.cell(2, 0)
|
|
|
|
|
|
|
|
.rowValues(List.of("테스트 1", blue, "테스트 2", 2500000, numeric));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<DataObject> dataset = List.of(
|
|
|
|
|
|
|
|
new DataObject().set("field0", "값 0, 0").set("field1", "값 0, 1").set("field2", 10000),
|
|
|
|
|
|
|
|
new DataObject().set("field0", "값 1, 0").set("field1", "값 1, 1").set("field2", 20000),
|
|
|
|
|
|
|
|
new DataObject().set("field0", "값 2, 0").set("field1", "값 2, 1").set("field2", 30000),
|
|
|
|
|
|
|
|
new DataObject().set("field0", "값 3, 0").set("field1", "값 3, 1").set("field2", 40000),
|
|
|
|
|
|
|
|
new DataObject().set("field0", "값 4, 0").set("field1", "값 4, 1").set("field2", 50000)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(4, 0)
|
|
|
|
xlsx.row(0)
|
|
|
|
.values(
|
|
|
|
.col(0).value("테스트 0-0")
|
|
|
|
dataset,
|
|
|
|
.col(1).value("테스트 0-1")
|
|
|
|
"field0", "field1",
|
|
|
|
.col(2).value(1234567890).value(numeric)
|
|
|
|
"field2", numeric,
|
|
|
|
.col(3).value(now).value(datetime);
|
|
|
|
format.of(null).value(obj -> format.toInt(((Map)obj).get("field2")) * 2).style(numeric)
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(1, 0)
|
|
|
|
|
|
|
|
.rowValues(List.of("테스트 1-0", "테스트 1-1", 234567890, numeric, now, datetime));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DataObject map = new DataObject()
|
|
|
|
|
|
|
|
.set("field1", "테스트 2-0")
|
|
|
|
|
|
|
|
.set("field2", "테스트 2-1")
|
|
|
|
|
|
|
|
.set("field3", 34567890)
|
|
|
|
|
|
|
|
.set("field4", now);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(2, 0).rowValues(map);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UnaryOperator<Object> concatField1_2 = obj -> {
|
|
|
|
|
|
|
|
DataObject rec = (DataObject)obj;
|
|
|
|
|
|
|
|
return rec.string("field1") + " " + rec.string("field2");
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(3, 0).rowValues(
|
|
|
|
|
|
|
|
map,
|
|
|
|
|
|
|
|
format
|
|
|
|
|
|
|
|
.value(concatField1_2)
|
|
|
|
|
|
|
|
.style(blue),
|
|
|
|
|
|
|
|
"",
|
|
|
|
|
|
|
|
"field3", numeric,
|
|
|
|
|
|
|
|
"field4", datetime
|
|
|
|
)
|
|
|
|
)
|
|
|
|
// .values(dataset)
|
|
|
|
.merge(0, 1);
|
|
|
|
.write(file("sxssf.xlsx"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
List<TestObject> objs = IntStream.range(0, 10).boxed()
|
|
|
|
void sxssf2() {
|
|
|
|
.map(i -> new TestObject()
|
|
|
|
Date now = new Date();
|
|
|
|
.setField1("테스트 " + (6 + i) + "-0")
|
|
|
|
List<DataObject> dataset = List.of(
|
|
|
|
.setField2("테스트 " + (6 + i) + "-1")
|
|
|
|
new DataObject().set("no", 1).set("title", "제목 1").set("content", "내용 1").set("amt", 1000000).set("regDate", now),
|
|
|
|
.setField3(i * 1000000)
|
|
|
|
new DataObject().set("no", 2).set("title", "제목 2").set("content", "내용 2").set("amt", 2000000).set("regDate", now),
|
|
|
|
.setDate(now)
|
|
|
|
new DataObject().set("no", 3).set("title", "제목 3").set("content", "내용 3").set("amt", 3000000).set("regDate", now),
|
|
|
|
).toList();
|
|
|
|
new DataObject().set("no", 4).set("title", "제목 4").set("content", "내용 4").set("amt", 4000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 5).set("title", "제목 5").set("content", "내용 5").set("amt", 5000000).set("regDate", now)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XLSWriter xlsx = new XLSWriter().worksheet(0);
|
|
|
|
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
|
|
|
|
CellStyle
|
|
|
|
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
|
|
|
|
numeric = format.n_nn0();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(5, 0)
|
|
|
|
xlsx.cell(5, 0)
|
|
|
|
//.values(dataset, "no", "title", "content", "amt", numeric, "regDate", datetime);
|
|
|
|
.values(
|
|
|
|
.values(dataset, "no", "title", "content",
|
|
|
|
objs,
|
|
|
|
"amt", numeric,
|
|
|
|
obj -> List.of(
|
|
|
|
format.of(null).value(obj -> ((Map)obj).get("amt") + " 원"),
|
|
|
|
obj.getField1(),
|
|
|
|
"regDate", datetime
|
|
|
|
obj.getField2(),
|
|
|
|
|
|
|
|
obj.getField3(),
|
|
|
|
|
|
|
|
numeric,
|
|
|
|
|
|
|
|
obj.getDate(),
|
|
|
|
|
|
|
|
datetime
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<DataObject> dataset = IntStream.range(0, 10).boxed()
|
|
|
|
|
|
|
|
.map(i -> (DataObject)new DataObject()
|
|
|
|
|
|
|
|
.set("field1", "테스트 " + (17 + i) + "-0")
|
|
|
|
|
|
|
|
.set("field2", "테스트 " + (17 + i) + "-1")
|
|
|
|
|
|
|
|
.set("field3", i * 1000000)
|
|
|
|
|
|
|
|
.set("date",now)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.write(file("sxssf2.xlsx"));
|
|
|
|
.toList();
|
|
|
|
}
|
|
|
|
xlsx.autoWidth();
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
xlsx.worksheet("두번째 시트").trackWidth(0, 1, 2, 3, 4);
|
|
|
|
void sxssf3() {
|
|
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
|
|
List<DataObject> dataset = List.of(
|
|
|
|
|
|
|
|
new DataObject().set("no", 1).set("title", "제목 1").set("content", "내용 1").set("amt", 1000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 2).set("title", "제목 2").set("content", "내용 2").set("amt", 2000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 3).set("title", "제목 3").set("content", "내용 3").set("amt", 3000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 4).set("title", "제목 4").set("content", "내용 4").set("amt", 4000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 5).set("title", "제목 5").set("content", "내용 5").set("amt", 5000000).set("regDate", now)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XLSWriter xlsx = new XLSWriter().worksheet(0);
|
|
|
|
xlsx.cell(0, 0)
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
.values(dataset);
|
|
|
|
CellStyle
|
|
|
|
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
|
|
|
|
numeric = format.n_nn0();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<CellDef> cellDefs = List.of(
|
|
|
|
xlsx.cell(11, 0)
|
|
|
|
new CellDef().setLabel("번호").setField("no"),
|
|
|
|
.values(
|
|
|
|
new CellDef().setLabel("제목").setField("title"),
|
|
|
|
dataset,
|
|
|
|
new CellDef().setLabel("내용").setField("content"),
|
|
|
|
format
|
|
|
|
// new CellDef().setLabel("금액").setField("amt").setValue(format.of("amt").style(numeric)),
|
|
|
|
.value(concatField1_2)
|
|
|
|
new CellDef().setLabel("금액").setField("amt").setValue(numeric),
|
|
|
|
.style(blue)
|
|
|
|
// new CellDef().setLabel("등록일시").setField("regDate").setValue(format.of("regDate").style(datetime))
|
|
|
|
.onCell(obj -> xlsx.merge(0, 1)),
|
|
|
|
new CellDef().setLabel("금액 2").setValue(format.of(null).value(obj -> ((Map)obj).get("amt") + " 원")),
|
|
|
|
"",
|
|
|
|
new CellDef().setLabel("등록일시").setField("regDate").setValue(datetime)
|
|
|
|
"field3", numeric,
|
|
|
|
);
|
|
|
|
"date", datetime
|
|
|
|
|
|
|
|
);
|
|
|
|
xlsx.cell(4, 0)
|
|
|
|
|
|
|
|
.rowValues(CellDef.header(cellDefs, null))
|
|
|
|
String dir = "src\\test\\resources\\files\\",
|
|
|
|
.cell(5, 0)
|
|
|
|
|
|
|
|
.values(dataset, CellDef.values(cellDefs))
|
|
|
|
|
|
|
|
.write(file("sxssf3.xlsx"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
|
|
|
void pictureComment() {
|
|
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
|
|
String dir = "C:\\project\\base project\\xit-docs\\src\\test\\resources\\files\\",
|
|
|
|
|
|
|
|
path1 = dir + "4148020220006850A.jpg",
|
|
|
|
path1 = dir + "4148020220006850A.jpg",
|
|
|
|
path2 = dir + "4148020220006869A.jpg";
|
|
|
|
path2 = dir + "4148020220006869A.jpg";
|
|
|
|
List<DataObject> dataset = List.of(
|
|
|
|
dataset = IntStream.range(0, 10).boxed()
|
|
|
|
new DataObject().set("no", 1).set("title", "제목 1").set("content", "내용 1").set("pic", path1).set("amt", 1000000).set("regDate", now),
|
|
|
|
.map(i -> (DataObject)new DataObject()
|
|
|
|
new DataObject().set("no", 2).set("title", "제목 2").set("content", "내용 2").set("pic", path2).set("amt", 2000000).set("regDate", now)
|
|
|
|
.set("field1", "테스트 " + (27 + i) + "-0")
|
|
|
|
);
|
|
|
|
.set("field2", "테스트 " + (27 + i) + "-1")
|
|
|
|
|
|
|
|
.set("field3", i * 1000000)
|
|
|
|
XLSWriter xlsx = new XLSWriter()
|
|
|
|
.set("pic", i % 2 == 0 ? path1 : path2)
|
|
|
|
.worksheet(0)
|
|
|
|
.set("date",now)
|
|
|
|
.cell(3, 0);
|
|
|
|
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
|
|
|
|
CellStyle
|
|
|
|
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
|
|
|
|
currency = format.cellStyle(new Style().dataFormat("#,##0 원").merge(Style.RIGHT));
|
|
|
|
|
|
|
|
Comment comment = new Comment(xlsx);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.values(
|
|
|
|
|
|
|
|
dataset, "no", "title", "content",
|
|
|
|
|
|
|
|
format.of(null)
|
|
|
|
|
|
|
|
.value(row -> null)
|
|
|
|
|
|
|
|
.onCell(row -> comment.setImageComment((String)((Map)row).get("pic"))),
|
|
|
|
|
|
|
|
"amt", currency,
|
|
|
|
|
|
|
|
format.of("regDate").style(datetime)
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.write(file("picture-comment.xlsx"));
|
|
|
|
.toList();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
CellStyle currency = format.cellStyle(new Style().dataFormat("#,##0 원").merge(Style.RIGHT));
|
|
|
|
void twoSheets() {
|
|
|
|
Comment comment = new Comment(xlsx);
|
|
|
|
Date now = new Date();
|
|
|
|
Format picFormat = format.of("pic")
|
|
|
|
List<DataObject> dataset = List.of(
|
|
|
|
.value(obj -> {
|
|
|
|
new DataObject().set("no", 1).set("title", "제목 1").set("content", "내용 1").set("amt", 1000000).set("regDate", now),
|
|
|
|
String path = (String)((Map)obj).get("pic");
|
|
|
|
new DataObject().set("no", 2).set("title", "제목 2").set("content", "내용 2").set("amt", 2000000).set("regDate", now),
|
|
|
|
return path.substring(path.lastIndexOf("\\") + 1);
|
|
|
|
new DataObject().set("no", 3).set("title", "제목 3").set("content", "내용 3").set("amt", 3000000).set("regDate", now),
|
|
|
|
})
|
|
|
|
new DataObject().set("no", 4).set("title", "제목 4").set("content", "내용 4").set("amt", 4000000).set("regDate", now),
|
|
|
|
.onCell(obj -> comment.setImageComment((String)((Map)obj).get("pic")));
|
|
|
|
new DataObject().set("no", 5).set("title", "제목 5").set("content", "내용 5").set("amt", 5000000).set("regDate", now)
|
|
|
|
|
|
|
|
);
|
|
|
|
xlsx.cell(22, 0)
|
|
|
|
|
|
|
|
.values(
|
|
|
|
XLSWriter xlsx = new XLSWriter().worksheet("첫번째 시트");
|
|
|
|
dataset,
|
|
|
|
Format format = new Format(xlsx);
|
|
|
|
format
|
|
|
|
CellStyle
|
|
|
|
.value(concatField1_2)
|
|
|
|
datetime = format.yyyy_mm_dd_hh_mm_ss(),
|
|
|
|
.style(blue)
|
|
|
|
numeric = format.n_nn0();
|
|
|
|
.onCell(row -> xlsx.merge(0, 1)),
|
|
|
|
|
|
|
|
"",
|
|
|
|
|
|
|
|
"field3",
|
|
|
|
|
|
|
|
currency,
|
|
|
|
|
|
|
|
picFormat,
|
|
|
|
|
|
|
|
"date",
|
|
|
|
|
|
|
|
datetime
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
List<CellDef> cellDefs = List.of(
|
|
|
|
List<CellDef> cellDefs = List.of(
|
|
|
|
new CellDef().setLabel("번호").setField("no"),
|
|
|
|
new CellDef().setLabel("제목").setValue(
|
|
|
|
new CellDef().setLabel("제목").setField("title"),
|
|
|
|
format
|
|
|
|
new CellDef().setLabel("내용").setField("content"),
|
|
|
|
.value(concatField1_2)
|
|
|
|
new CellDef().setLabel("금액").setField("amt").setValue(numeric),
|
|
|
|
.style(blue)
|
|
|
|
new CellDef().setLabel("금액 2").setValue(format.of(null).value(obj -> ((Map)obj).get("amt") + " 원")),
|
|
|
|
.onCell(row -> xlsx.merge(0, 1))
|
|
|
|
new CellDef().setLabel("등록일시").setField("regDate").setValue(datetime)
|
|
|
|
),
|
|
|
|
|
|
|
|
CellDef.EMPTY,
|
|
|
|
|
|
|
|
new CellDef().setLabel("금액").setField("field3").setValue(numeric),
|
|
|
|
|
|
|
|
new CellDef().setLabel("사진").setValue(picFormat),
|
|
|
|
|
|
|
|
new CellDef().setLabel("등록일시").setField("date").setValue(datetime)
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.cell(5, 0)
|
|
|
|
xlsx.cell(33, 0)
|
|
|
|
|
|
|
|
.rowValues(CellDef.header(cellDefs, null))
|
|
|
|
|
|
|
|
.merge(0, 1)
|
|
|
|
|
|
|
|
.cell(34, 0)
|
|
|
|
.values(dataset, CellDef.values(cellDefs));
|
|
|
|
.values(dataset, CellDef.values(cellDefs));
|
|
|
|
|
|
|
|
|
|
|
|
String dir = "C:\\project\\base project\\xit-docs\\src\\test\\resources\\files\\",
|
|
|
|
xlsx.autoWidth();
|
|
|
|
path1 = dir + "4148020220006850A.jpg",
|
|
|
|
|
|
|
|
path2 = dir + "4148020220006869A.jpg";
|
|
|
|
|
|
|
|
dataset = List.of(
|
|
|
|
|
|
|
|
new DataObject().set("no", 1).set("title", "제목 1").set("content", "내용 1").set("pic", path1).set("amt", 1000000).set("regDate", now),
|
|
|
|
|
|
|
|
new DataObject().set("no", 2).set("title", "제목 2").set("content", "내용 2").set("pic", path2).set("amt", 2000000).set("regDate", now)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.worksheet("두번째 시트").cell(3, 0);
|
|
|
|
xlsx.write(file("xlsx-test.xlsx"));
|
|
|
|
CellStyle currency = format.cellStyle(new Style().dataFormat("#,##0 원").merge(Style.RIGHT));
|
|
|
|
}
|
|
|
|
Comment comment = new Comment(xlsx);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xlsx.values(
|
|
|
|
static class TestObject {
|
|
|
|
dataset, "no", "title", "content",
|
|
|
|
private String
|
|
|
|
format.of(null)
|
|
|
|
field1,
|
|
|
|
.value(row -> null)
|
|
|
|
field2;
|
|
|
|
.onCell(row -> comment.setImageComment((String)((Map)row).get("pic"))),
|
|
|
|
private int field3;
|
|
|
|
"amt", currency,
|
|
|
|
private Date date;
|
|
|
|
format.of("regDate").style(datetime)
|
|
|
|
|
|
|
|
)
|
|
|
|
public String getField1() {
|
|
|
|
.write(file("two-sheets.xlsx"));
|
|
|
|
return field1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestObject setField1(String field1) {
|
|
|
|
|
|
|
|
this.field1 = field1;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getField2() {
|
|
|
|
|
|
|
|
return field2;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestObject setField2(String field2) {
|
|
|
|
|
|
|
|
this.field2 = field2;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getField3() {
|
|
|
|
|
|
|
|
return field3;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestObject setField3(int field3) {
|
|
|
|
|
|
|
|
this.field3 = field3;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Date getDate() {
|
|
|
|
|
|
|
|
return date;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestObject setDate(Date date) {
|
|
|
|
|
|
|
|
this.date = date;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|