메모 이미지 배경 설정 추가

master
mjkhan21 9 months ago
parent 534c83cfe0
commit 1ab36fe80e

@ -1,5 +1,6 @@
package cokr.xit.base.file.xls; package cokr.xit.base.file.xls;
import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
@ -12,18 +13,33 @@ import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell; import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFDrawing;
import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFVMLDrawing;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STTrueFalse;
import org.springframework.util.FileCopyUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.microsoft.schemas.vml.CTFill;
import com.microsoft.schemas.vml.CTShape;
import com.microsoft.schemas.vml.STFillType;
/** . /** .
* XLSWriter 릿 . * XLSWriter 릿 .
@ -188,9 +204,7 @@ public class XLSWriter extends XLS {
* @return XLSWriter * @return XLSWriter
*/ */
public XLSWriter value(Object val, Object style) { public XLSWriter value(Object val, Object style) {
if (isEmpty(val)) if (!isEmpty(val)) {
return this;
if (val instanceof String) { if (val instanceof String) {
cell.setCellValue((String)val); cell.setCellValue((String)val);
} else if (val instanceof Number) { } else if (val instanceof Number) {
@ -203,7 +217,7 @@ public class XLSWriter extends XLS {
cell.setCellValue(b.booleanValue()); cell.setCellValue(b.booleanValue());
} else } else
throw new IllegalArgumentException(val.getClass().getName() + ": " + val); throw new IllegalArgumentException(val.getClass().getName() + ": " + val);
}
setCellStyle(style); setCellStyle(style);
return this; return this;
@ -245,6 +259,8 @@ public class XLSWriter extends XLS {
setCellStyle(val); setCellStyle(val);
} else if (val instanceof Formatter) { } else if (val instanceof Formatter) {
setCellStyle(val); setCellStyle(val);
} else if (val instanceof Runnable) {
((Runnable)val).run();
} else { } else {
col(x).value(val); col(x).value(val);
++x; ++x;
@ -302,6 +318,8 @@ public class XLSWriter extends XLS {
val = formatter.convert.apply(map); val = formatter.convert.apply(map);
} }
vals.add(val); vals.add(val);
if (formatter.onCell != null)
vals.add(formatter.onCell.apply(map));
Styler styler = formatter.styler; Styler styler = formatter.styler;
CellStyle style = formatter.style; CellStyle style = formatter.style;
@ -309,7 +327,6 @@ public class XLSWriter extends XLS {
style = cellStyle(styler); style = cellStyle(styler);
if (style != null) if (style != null)
vals.add(style); vals.add(style);
} else { } else {
vals.add(map.get(obj)); vals.add(map.get(obj));
} }
@ -763,6 +780,8 @@ public class XLSWriter extends XLS {
private CellStyle style; private CellStyle style;
private Styler styler; private Styler styler;
private Function<Map<?, ?>, Runnable> onCell;
/** . /** .
* @param key * @param key
* @return Formatter * @return Formatter
@ -772,6 +791,15 @@ public class XLSWriter extends XLS {
return this; return this;
} }
/** function .
* @param func
* @return Formatter
*/
public Formatter format(Function<Map<?, ?>, Object> func) {
convert = func;
return this;
}
/** . /** .
* @param style * @param style
* @return Formatter * @return Formatter
@ -790,12 +818,8 @@ public class XLSWriter extends XLS {
return this; return this;
} }
/** function . public Formatter onCell(Function<Map<?, ?>, Runnable> func) {
* @param func onCell = func;
* @return Formatter
*/
public Formatter format(Function<Map<?, ?>, Object> func) {
convert = func;
return this; return this;
} }
} }
@ -847,6 +871,10 @@ public class XLSWriter extends XLS {
return defs.stream().map(CellDef::getValue).toList().toArray(); return defs.stream().map(CellDef::getValue).toList().toArray();
} }
public static TypeReference<List<CellDef>> listType() {
return new TypeReference<List<CellDef>>() {};
}
private String private String
label, label,
field; field;
@ -918,4 +946,93 @@ public class XLSWriter extends XLS {
return this; return this;
} }
} }
public static class CommentSupport {
private XLSWriter writer;
private XSSFWorkbook workbook;
private CreationHelper factory;
private ClientAnchor anchor;
private Image image;
public CommentSupport(XLSWriter writer) {
this.writer = writer;
workbook = this.writer.workbook.getXSSFWorkbook();
factory = workbook.getCreationHelper();
anchor = factory.createClientAnchor();
image = new Image(this.writer);
}
public XSSFComment create(String str) {
int row = writer.cell.getRowIndex();
anchor.setRow1(row);
anchor.setRow2(row + 17);
int col = writer.cell.getColumnIndex();
anchor.setCol1(col);
anchor.setCol2(col + 6);
SXSSFDrawing drawing = writer.worksheet.createDrawingPatriarch();
XSSFComment comment = (XSSFComment)drawing.createCellComment(anchor);
comment.setString(str);
writer.cell.setCellComment(comment);
return comment;
}
public void setBackgroundImage(String title, String path) {
int picIndex = image.add(path);
XSSFPictureData pic = workbook.getAllPictures().get(picIndex);
XSSFVMLDrawing vml = writer.worksheet.getVMLDrawing(true);
RelationPart rp = vml.addRelation(null, XSSFRelation.IMAGES, pic);
int row = writer.cell.getRowIndex();
int col = writer.cell.getColumnIndex();
CTShape shape = vml.findCommentShape(row, col);
CTFill fill = shape.getFillArray(0);
fill.setColor2(fill.getColor());
fill.unsetColor();
fill.setRelid(rp.getRelationship().getId());
fill.setTitle(title);
fill.setRecolor(STTrueFalse.T);
fill.setRotate(STTrueFalse.T);
fill.setType(STFillType.FRAME);
}
public void setImageComment(String path) {
create("");
setBackgroundImage("", path);
}
public Runnable getImageCommenter(String path) {
return () -> setImageComment(path);
}
}
public static class Image {
private XLSWriter writer;
public Image(XLSWriter writer) {
this.writer = writer;
}
public int add(InputStream input, int imgType) {
try {
return writer.workbook.addPicture(
FileCopyUtils.copyToByteArray(input),
imgType
);
} catch (Exception e) {
throw runtimeException(e);
}
}
public int add(String path) {
String str = path.toLowerCase();
int imgType = str.endsWith(".png") ? SXSSFWorkbook.PICTURE_TYPE_PNG : SXSSFWorkbook.PICTURE_TYPE_JPEG;
try (FileInputStream input = new FileInputStream(path)) {
return add(input, imgType);
} catch (Exception e) {
throw runtimeException(e);
}
}
}
} }
Loading…
Cancel
Save