src/core/net/sf/basedb/util/excel/AutoFormatter.java

Code
Comments
Other
Rev Date Author Line
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 8   Excel formatter implementation that automatically selects a format
7675 27 Mar 19 nicklas 9   depending on the type/class of the value.
7675 27 Mar 19 nicklas 10   
7675 27 Mar 19 nicklas 11   * Null values are created as empty cells: {@link ExcelValue#emptyCell()}
7675 27 Mar 19 nicklas 12   * Integer and Long values are created as numeric cells with no decimals: {@link ExcelValue#asInt(Number)}
7675 27 Mar 19 nicklas 13   * Other numeric values are created as numeric cell without format specification: {@link ExcelValue#asNumber(Number, int)}
7675 27 Mar 19 nicklas 14   * 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 15   * Date values with other times are created as numeric cells with timestamp formatting applied: {@link ExcelValue#asTimestamp(Date, String)}
7675 27 Mar 19 nicklas 16   * Boolean values are created as numeric cells (0 or 1) with BOOLEAN format: {@link ExcelValue#asBoolean(Boolean)}
7675 27 Mar 19 nicklas 17   * 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 19   @author nicklas
7675 27 Mar 19 nicklas 20   @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 33     Set the data format template to use for date values (=dates with all time components at 0).
7675 27 Mar 19 nicklas 34     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 42     @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 50     Set the data format template to use for timestamp values. If not set, the default
7675 27 Mar 19 nicklas 51     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 59     @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 }