parent
98a8ea0e58
commit
386b748ff4
@ -0,0 +1,56 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.poi;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2020-03-12 13:27
|
||||||
|
*/
|
||||||
|
public class CellStyleFactory {
|
||||||
|
private final short borderTop;
|
||||||
|
private final short borderBottom;
|
||||||
|
private final short borderLeft;
|
||||||
|
private final short borderRight;
|
||||||
|
private final short align;
|
||||||
|
private final short valign;
|
||||||
|
|
||||||
|
public CellStyleFactory(short borderTop, short borderBottom, short borderLeft, short borderRight, short align, short valign) {
|
||||||
|
this.borderTop = borderTop;
|
||||||
|
this.borderBottom = borderBottom;
|
||||||
|
this.borderLeft = borderLeft;
|
||||||
|
this.borderRight = borderRight;
|
||||||
|
this.align = align;
|
||||||
|
this.valign = valign;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyleFactory(short borderTopBottom, short borderLeftRight, short align, short valign) {
|
||||||
|
this(borderTopBottom, borderTopBottom, borderLeftRight, borderLeftRight, align, valign);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyleFactory(short border, short align, short valign) {
|
||||||
|
this(border, border, align, valign);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyleFactory(short border, short align) {
|
||||||
|
this(border, border, align, CellStyle.VERTICAL_CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyle buildCellStyle(Workbook workbook, Font font) {
|
||||||
|
CellStyle style = workbook.createCellStyle();
|
||||||
|
style.setBorderBottom(borderBottom);
|
||||||
|
style.setBorderRight(borderRight);
|
||||||
|
style.setBorderLeft(borderLeft);
|
||||||
|
style.setBorderTop(borderTop);
|
||||||
|
style.setAlignment(align);
|
||||||
|
style.setVerticalAlignment(valign);
|
||||||
|
if (font != null) {
|
||||||
|
style.setFont(font);
|
||||||
|
}
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyle buildCellStyle(Workbook workbook) {
|
||||||
|
return buildCellStyle(workbook, null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.poi;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2020-03-12 11:59
|
||||||
|
*/
|
||||||
|
public class ExcelFileBuilder {
|
||||||
|
private ExcelTemplate template;
|
||||||
|
private Map<String, List<JSONObject>> sheetsData;
|
||||||
|
private boolean blocked = false;
|
||||||
|
|
||||||
|
public ExcelFileBuilder(ExcelTemplate template) {
|
||||||
|
this.template = template;
|
||||||
|
this.sheetsData = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelFileBuilder bindData(String sheetName, List<JSONObject> data) {
|
||||||
|
checkBlock();
|
||||||
|
if (template.hasSheet(sheetName)) {
|
||||||
|
sheetsData.put(sheetName, data);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Sheet name '" + sheetName + "' not exists");
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkBlock() {
|
||||||
|
if (blocked) {
|
||||||
|
throw new IllegalStateException("Builder blocked");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelFileBuilder bindSingleSheetData(List<JSONObject> data) {
|
||||||
|
if (template.getSheets().size() == 1) {
|
||||||
|
String name = new ArrayList<>(template.getSheets().keySet()).get(0);
|
||||||
|
bindData(name, data);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("There are more than one sheet");
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void build(OutputStream out) {
|
||||||
|
blocked = true;
|
||||||
|
try (Workbook workbook = new XSSFWorkbook()) {
|
||||||
|
Map<String, ExcelTemplate.SheetTemplate> sheetTpls = template.getSheets();
|
||||||
|
for (Map.Entry<String, ExcelTemplate.SheetTemplate> sheetTpl : sheetTpls.entrySet()) {
|
||||||
|
Sheet sheet = workbook.createSheet(sheetTpl.getKey());
|
||||||
|
List<JSONObject> data = sheetsData.get(sheetTpl.getKey());
|
||||||
|
if (data == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sheetTpl.getValue().buildSheet(sheet, data);
|
||||||
|
}
|
||||||
|
workbook.write(out);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,186 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.poi;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2020-03-12 11:59
|
||||||
|
*/
|
||||||
|
public class ExcelTemplate {
|
||||||
|
public static final CellStyleFactory STYLE_LEFT = new CellStyleFactory(CellStyle.BORDER_MEDIUM, CellStyle.ALIGN_LEFT);
|
||||||
|
public static final CellStyleFactory STYLE_RIGHT = new CellStyleFactory(CellStyle.BORDER_MEDIUM, CellStyle.ALIGN_RIGHT);
|
||||||
|
private Map<String, SheetTemplate> sheets;
|
||||||
|
|
||||||
|
public ExcelTemplate() {
|
||||||
|
this.sheets = new LinkedHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SheetTemplate addSheet(String name) {
|
||||||
|
SheetTemplate sheetTpl = new SheetTemplate(this, name);
|
||||||
|
sheets.put(name, sheetTpl);
|
||||||
|
return sheetTpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<String, SheetTemplate> getSheets() {
|
||||||
|
return sheets;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean hasSheet(String sheetName) {
|
||||||
|
return sheets.containsKey(sheetName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SheetTemplate {
|
||||||
|
private ExcelTemplate parent;
|
||||||
|
private String name;
|
||||||
|
private List<ColumnTemplate> columns;
|
||||||
|
|
||||||
|
private SheetTemplate(ExcelTemplate parent, String name) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.name = name;
|
||||||
|
this.columns = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelTemplate build() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SheetTemplate newSheet(String name) {
|
||||||
|
return parent.addSheet(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addColumn(int columnType, String name, ValueProvider<?> provider) {
|
||||||
|
ColumnTemplate col = new ColumnTemplate(this, name, columnType, provider);
|
||||||
|
columns.add(col);
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addDateColumn(String pattern, String name) {
|
||||||
|
return addDateColumn(pattern, name, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addDateColumn(String pattern, String name, String key) {
|
||||||
|
return this.addColumn(Cell.CELL_TYPE_STRING, name, json -> DateFormatUtils.format(json.getDate(key), pattern));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addNumberColumn(String name) {
|
||||||
|
return this.addNumberColumn(name, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addNumberColumn(String name, String key) {
|
||||||
|
return this.addColumn(Cell.CELL_TYPE_NUMERIC, name, json -> json.getString(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addStringColumn(String name) {
|
||||||
|
return this.addStringColumn(name, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addStringColumn(String name, String key) {
|
||||||
|
return this.addColumn(Cell.CELL_TYPE_STRING, name, json -> json.getString(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate addAutoTypeColumn(String name, ValueProvider<?> provider) {
|
||||||
|
ColumnTemplate col = new ColumnTemplate(this, name, null, provider);
|
||||||
|
columns.add(col);
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<ColumnTemplate> getColumns() {
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buildSheet(Sheet sheet, List<JSONObject> data) {
|
||||||
|
int rowNum = 0;
|
||||||
|
Row titleRow = sheet.createRow(rowNum);
|
||||||
|
rowNum++;
|
||||||
|
Workbook workbook = sheet.getWorkbook();
|
||||||
|
Font boldFont = PoiUtils.initBoldFont(workbook);
|
||||||
|
CellStyle titleStyle = new CellStyleFactory(CellStyle.BORDER_MEDIUM, CellStyle.ALIGN_CENTER).buildCellStyle(workbook, boldFont);
|
||||||
|
for (int i = 0, len = columns.size(); i < len; i++) {
|
||||||
|
ColumnTemplate col = columns.get(i);
|
||||||
|
Cell cell = titleRow.createCell(i, Cell.CELL_TYPE_STRING);
|
||||||
|
cell.setCellStyle(titleStyle);
|
||||||
|
cell.setCellValue(col.name);
|
||||||
|
}
|
||||||
|
for (JSONObject item : data) {
|
||||||
|
Row dataRow = sheet.createRow(rowNum);
|
||||||
|
rowNum++;
|
||||||
|
for (int i = 0, len = columns.size(); i < len; i++) {
|
||||||
|
ColumnTemplate col = columns.get(i);
|
||||||
|
col.buildCell(dataRow, i, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ColumnTemplate {
|
||||||
|
private SheetTemplate parent;
|
||||||
|
private String name;
|
||||||
|
private ValueProvider<?> valueProvider;
|
||||||
|
private Integer columnType;
|
||||||
|
private CellStyleFactory cellStyle;
|
||||||
|
private FontFactory fontFactory;
|
||||||
|
|
||||||
|
public ColumnTemplate(SheetTemplate parent, String name, Integer columnType, ValueProvider<?> valueProvider) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.name = name;
|
||||||
|
this.columnType = columnType;
|
||||||
|
this.valueProvider = valueProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate setCellStyle(CellStyleFactory cellStyle) {
|
||||||
|
this.cellStyle = cellStyle;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SheetTemplate ok() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void buildCell(Row row, int columnNum, JSONObject data) {
|
||||||
|
Object value = valueProvider.getValue(data);
|
||||||
|
if (value == null) {
|
||||||
|
row.createCell(columnNum, Cell.CELL_TYPE_BLANK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (columnType == null) {
|
||||||
|
columnType = PoiUtils.convertCellType(value.getClass());
|
||||||
|
}
|
||||||
|
CellStyle style = initCellStyle(row.getSheet().getWorkbook(), columnType);
|
||||||
|
Cell cell = row.createCell(columnNum, columnType);
|
||||||
|
cell.setCellStyle(style);
|
||||||
|
PoiUtils.setCellValue(cell, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CellStyle initCellStyle(Workbook workbook, Integer columnType) {
|
||||||
|
Font font = fontFactory != null ? fontFactory.buildFont(workbook) : null;
|
||||||
|
if (cellStyle == null) {
|
||||||
|
if (columnType == Cell.CELL_TYPE_NUMERIC || this.columnType == Cell.CELL_TYPE_BOOLEAN) {
|
||||||
|
return STYLE_RIGHT.buildCellStyle(workbook, font);
|
||||||
|
} else {
|
||||||
|
return STYLE_LEFT.buildCellStyle(workbook, font);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return cellStyle.buildCellStyle(workbook, font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColumnTemplate setFontFactory(FontFactory fontFactory) {
|
||||||
|
this.fontFactory = fontFactory;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ValueProvider<T> {
|
||||||
|
T getValue(JSONObject item);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.poi;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2020-03-12 13:27
|
||||||
|
*/
|
||||||
|
public class FontFactory {
|
||||||
|
private boolean bold;
|
||||||
|
private short color;
|
||||||
|
private boolean italic;
|
||||||
|
|
||||||
|
public FontFactory(boolean bold, short color, boolean italic) {
|
||||||
|
this.bold = bold;
|
||||||
|
this.color = color;
|
||||||
|
this.italic = italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FontFactory(boolean bold, boolean italic) {
|
||||||
|
this(bold, Font.COLOR_NORMAL, italic);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FontFactory(boolean bold) {
|
||||||
|
this(bold, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Font buildFont(Workbook workbook) {
|
||||||
|
Font font = workbook.createFont();
|
||||||
|
font.setBold(bold);
|
||||||
|
font.setColor(color);
|
||||||
|
font.setItalic(italic);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.poi;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.time.temporal.Temporal;
|
||||||
|
import java.time.temporal.TemporalField;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2020-03-12 12:43
|
||||||
|
*/
|
||||||
|
public class PoiUtils {
|
||||||
|
private static final Map<Class<?>, Class<?>> PRIMITIVE_CLASSES = new HashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
PRIMITIVE_CLASSES.put(boolean.class, Boolean.class);
|
||||||
|
PRIMITIVE_CLASSES.put(byte.class, Byte.class);
|
||||||
|
PRIMITIVE_CLASSES.put(short.class, Short.class);
|
||||||
|
PRIMITIVE_CLASSES.put(char.class, Character.class);
|
||||||
|
PRIMITIVE_CLASSES.put(int.class, Integer.class);
|
||||||
|
PRIMITIVE_CLASSES.put(long.class, Long.class);
|
||||||
|
PRIMITIVE_CLASSES.put(float.class, Float.class);
|
||||||
|
PRIMITIVE_CLASSES.put(double.class, Double.class);
|
||||||
|
PRIMITIVE_CLASSES.put(void.class, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Font initBoldFont(Workbook workbook) {
|
||||||
|
Font font = workbook.createFont();
|
||||||
|
font.setBold(true);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static int convertCellType(Class<?> valueClass) {
|
||||||
|
if (valueClass.isPrimitive()) {
|
||||||
|
valueClass = PRIMITIVE_CLASSES.get(valueClass);
|
||||||
|
}
|
||||||
|
if (Number.class.isAssignableFrom(valueClass)) {
|
||||||
|
return Cell.CELL_TYPE_NUMERIC;
|
||||||
|
}
|
||||||
|
if (Date.class.isAssignableFrom(valueClass) || Temporal.class.isAssignableFrom(valueClass)) {
|
||||||
|
return Cell.CELL_TYPE_NUMERIC;
|
||||||
|
}
|
||||||
|
if (Boolean.class.isAssignableFrom(valueClass)) {
|
||||||
|
return Cell.CELL_TYPE_BOOLEAN;
|
||||||
|
}
|
||||||
|
return Cell.CELL_TYPE_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setCellValue(Cell cell, Object value) {
|
||||||
|
Class valueClass = value.getClass();
|
||||||
|
if (valueClass.isPrimitive()) {
|
||||||
|
valueClass = PRIMITIVE_CLASSES.get(valueClass);
|
||||||
|
}
|
||||||
|
if (Number.class.isAssignableFrom(valueClass)) {
|
||||||
|
cell.setCellValue((double) value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Date.class.isAssignableFrom(valueClass)) {
|
||||||
|
cell.setCellValue(((Date) value).getTime() / 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Boolean.class.isAssignableFrom(valueClass)) {
|
||||||
|
cell.setCellValue((boolean) value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cell.setCellValue(value.toString());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue