7675 |
27 Mar 19 |
nicklas |
1 |
package net.sf.basedb.util.excel; |
7675 |
27 Mar 19 |
nicklas |
2 |
|
7675 |
27 Mar 19 |
nicklas |
3 |
import java.time.ZoneId; |
7675 |
27 Mar 19 |
nicklas |
4 |
import java.time.temporal.ChronoField; |
7675 |
27 Mar 19 |
nicklas |
5 |
import java.util.Date; |
7675 |
27 Mar 19 |
nicklas |
6 |
|
7675 |
27 Mar 19 |
nicklas |
7 |
/** |
7675 |
27 Mar 19 |
nicklas |
Excel formatter implementation that automatically selects a format |
7675 |
27 Mar 19 |
nicklas |
depending on the type/class of the value. |
7675 |
27 Mar 19 |
nicklas |
10 |
|
7675 |
27 Mar 19 |
nicklas |
* Null values are created as empty cells: {@link ExcelValue#emptyCell()} |
7675 |
27 Mar 19 |
nicklas |
* Integer and Long values are created as numeric cells with no decimals: {@link ExcelValue#asInt(Number)} |
7675 |
27 Mar 19 |
nicklas |
* Other numeric values are created as numeric cell without format specification: {@link ExcelValue#asNumber(Number, int)} |
7675 |
27 Mar 19 |
nicklas |
* Date values with time at midnight are created as numeric cells with date formatting applied: {@link ExcelValue#asDate(Date, String)} |
7675 |
27 Mar 19 |
nicklas |
* Date values with other times are created as numeric cells with timestamp formatting applied: {@link ExcelValue#asTimestamp(Date, String)} |
7675 |
27 Mar 19 |
nicklas |
* Boolean values are created as numeric cells (0 or 1) with BOOLEAN format: {@link ExcelValue#asBoolean(Boolean)} |
7675 |
27 Mar 19 |
nicklas |
* All other values are created as string values via their toString() method: {@link ExcelValue#asString(String)} |
7675 |
27 Mar 19 |
nicklas |
18 |
|
7675 |
27 Mar 19 |
nicklas |
@author nicklas |
7675 |
27 Mar 19 |
nicklas |
@since 3.15 |
7675 |
27 Mar 19 |
nicklas |
21 |
*/ |
7675 |
27 Mar 19 |
nicklas |
22 |
public class AutoFormatter |
7675 |
27 Mar 19 |
nicklas |
23 |
implements ExcelFormatter<Object, Object> |
7675 |
27 Mar 19 |
nicklas |
24 |
{ |
7675 |
27 Mar 19 |
nicklas |
25 |
|
7675 |
27 Mar 19 |
nicklas |
26 |
private String dateFormat; |
7675 |
27 Mar 19 |
nicklas |
27 |
private String timestampFormat; |
7675 |
27 Mar 19 |
nicklas |
28 |
|
7675 |
27 Mar 19 |
nicklas |
29 |
public AutoFormatter() |
7675 |
27 Mar 19 |
nicklas |
30 |
{} |
7675 |
27 Mar 19 |
nicklas |
31 |
|
7675 |
27 Mar 19 |
nicklas |
32 |
/** |
7675 |
27 Mar 19 |
nicklas |
Set the data format template to use for date values (=dates with all time components at 0). |
7675 |
27 Mar 19 |
nicklas |
If not set, the default from {@link ExcelValue#asDate(Date, String)} is used. |
7675 |
27 Mar 19 |
nicklas |
35 |
*/ |
7675 |
27 Mar 19 |
nicklas |
36 |
public void setDateFormat(String dateFormat) |
7675 |
27 Mar 19 |
nicklas |
37 |
{ |
7675 |
27 Mar 19 |
nicklas |
38 |
this.dateFormat = dateFormat; |
7675 |
27 Mar 19 |
nicklas |
39 |
} |
7675 |
27 Mar 19 |
nicklas |
40 |
|
7675 |
27 Mar 19 |
nicklas |
41 |
/** |
7675 |
27 Mar 19 |
nicklas |
@see #setDateFormat(String) |
7675 |
27 Mar 19 |
nicklas |
43 |
*/ |
7675 |
27 Mar 19 |
nicklas |
44 |
public String getDateFormat() |
7675 |
27 Mar 19 |
nicklas |
45 |
{ |
7675 |
27 Mar 19 |
nicklas |
46 |
return dateFormat; |
7675 |
27 Mar 19 |
nicklas |
47 |
} |
7675 |
27 Mar 19 |
nicklas |
48 |
|
7675 |
27 Mar 19 |
nicklas |
49 |
/** |
7675 |
27 Mar 19 |
nicklas |
Set the data format template to use for timestamp values. If not set, the default |
7675 |
27 Mar 19 |
nicklas |
from {@link ExcelValue#asTimestamp(Date, String)} is used. |
7675 |
27 Mar 19 |
nicklas |
52 |
*/ |
7675 |
27 Mar 19 |
nicklas |
53 |
public void setTimstampFormat(String timestampFormat) |
7675 |
27 Mar 19 |
nicklas |
54 |
{ |
7675 |
27 Mar 19 |
nicklas |
55 |
this.timestampFormat = timestampFormat; |
7675 |
27 Mar 19 |
nicklas |
56 |
} |
7675 |
27 Mar 19 |
nicklas |
57 |
|
7675 |
27 Mar 19 |
nicklas |
58 |
/** |
7675 |
27 Mar 19 |
nicklas |
@see #setTimstampFormat(String) |
7675 |
27 Mar 19 |
nicklas |
60 |
*/ |
7675 |
27 Mar 19 |
nicklas |
61 |
public String getTimstampFormat() |
7675 |
27 Mar 19 |
nicklas |
62 |
{ |
7675 |
27 Mar 19 |
nicklas |
63 |
return timestampFormat; |
7675 |
27 Mar 19 |
nicklas |
64 |
} |
7675 |
27 Mar 19 |
nicklas |
65 |
|
7675 |
27 Mar 19 |
nicklas |
66 |
@SuppressWarnings({ "rawtypes", "unchecked" }) |
7675 |
27 Mar 19 |
nicklas |
67 |
@Override |
7675 |
27 Mar 19 |
nicklas |
68 |
public ExcelValue<Object> toExcelValue(Object value) |
7675 |
27 Mar 19 |
nicklas |
69 |
{ |
7675 |
27 Mar 19 |
nicklas |
70 |
ExcelValue ev = null; |
7675 |
27 Mar 19 |
nicklas |
71 |
if (value == null) |
7675 |
27 Mar 19 |
nicklas |
72 |
{ |
7675 |
27 Mar 19 |
nicklas |
73 |
ev = ExcelValue.emptyCell(); |
7675 |
27 Mar 19 |
nicklas |
74 |
} |
7675 |
27 Mar 19 |
nicklas |
75 |
else if (value instanceof Number) |
7675 |
27 Mar 19 |
nicklas |
76 |
{ |
7675 |
27 Mar 19 |
nicklas |
77 |
Number n = (Number)value; |
7675 |
27 Mar 19 |
nicklas |
78 |
if (value instanceof Integer || value instanceof Long) |
7675 |
27 Mar 19 |
nicklas |
79 |
{ |
7675 |
27 Mar 19 |
nicklas |
80 |
ev = ExcelValue.asInt(n); |
7675 |
27 Mar 19 |
nicklas |
81 |
} |
7675 |
27 Mar 19 |
nicklas |
82 |
else |
7675 |
27 Mar 19 |
nicklas |
83 |
{ |
7675 |
27 Mar 19 |
nicklas |
84 |
ev = ExcelValue.asNumber(n, -1); |
7675 |
27 Mar 19 |
nicklas |
85 |
} |
7675 |
27 Mar 19 |
nicklas |
86 |
} |
7675 |
27 Mar 19 |
nicklas |
87 |
else if (value instanceof Date) |
7675 |
27 Mar 19 |
nicklas |
88 |
{ |
7675 |
27 Mar 19 |
nicklas |
89 |
Date d = (Date)value; |
7675 |
27 Mar 19 |
nicklas |
90 |
boolean atMidnight = d.toInstant().atZone(ZoneId.systemDefault()).get(ChronoField.MINUTE_OF_DAY) == 0; |
7675 |
27 Mar 19 |
nicklas |
91 |
if (atMidnight) |
7675 |
27 Mar 19 |
nicklas |
92 |
{ |
7675 |
27 Mar 19 |
nicklas |
93 |
ev = ExcelValue.asDate(d, dateFormat); |
7675 |
27 Mar 19 |
nicklas |
94 |
} |
7675 |
27 Mar 19 |
nicklas |
95 |
else |
7675 |
27 Mar 19 |
nicklas |
96 |
{ |
7675 |
27 Mar 19 |
nicklas |
97 |
ev = ExcelValue.asTimestamp(d, timestampFormat); |
7675 |
27 Mar 19 |
nicklas |
98 |
} |
7675 |
27 Mar 19 |
nicklas |
99 |
} |
7675 |
27 Mar 19 |
nicklas |
100 |
else if (value instanceof Boolean) |
7675 |
27 Mar 19 |
nicklas |
101 |
{ |
7675 |
27 Mar 19 |
nicklas |
102 |
ev = ExcelValue.asBoolean((Boolean)value); |
7675 |
27 Mar 19 |
nicklas |
103 |
} |
7675 |
27 Mar 19 |
nicklas |
104 |
else |
7675 |
27 Mar 19 |
nicklas |
105 |
{ |
7675 |
27 Mar 19 |
nicklas |
106 |
ev = ExcelValue.asString(value.toString()); |
7675 |
27 Mar 19 |
nicklas |
107 |
} |
7675 |
27 Mar 19 |
nicklas |
108 |
return ev; |
7675 |
27 Mar 19 |
nicklas |
109 |
} |
7675 |
27 Mar 19 |
nicklas |
110 |
|
7675 |
27 Mar 19 |
nicklas |
111 |
} |