AbstractDateCellConverter.java

  1. package com.gh.mygreen.xlsmapper.cellconverter.impl;

  2. import java.util.Date;
  3. import java.util.Optional;

  4. import org.apache.poi.ss.usermodel.Cell;
  5. import org.apache.poi.ss.usermodel.CellType;

  6. import com.gh.mygreen.xlsmapper.Configuration;
  7. import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter;
  8. import com.gh.mygreen.xlsmapper.cellconverter.CellStyleProxy;
  9. import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException;
  10. import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
  11. import com.gh.mygreen.xlsmapper.textformatter.TextParseException;
  12. import com.gh.mygreen.xlsmapper.util.POIUtils;
  13. import com.gh.mygreen.xlsmapper.util.Utils;

  14. /**
  15.  * 日時型のConverterの抽象クラス。
  16.  * <p>{@link Date}を継承している<code>javax.sql.Time/Date/Timestamp</code>はこのクラスを継承して作成します。</p>
  17.  *
  18.  * @version 2.0
  19.  * @author T.TSUCHIE
  20.  *
  21.  */
  22. public abstract class AbstractDateCellConverter<T extends Date> extends BaseCellConverter<T> {

  23.     /**
  24.      * 書き込み時のExcelのセルの書式
  25.      * <p>セルに書式が設定されていないときのデフォルトの書式
  26.      */
  27.     private String defaultExcelPattern;

  28.     /**
  29.      * アノテーションで書き込み時の指定されてたセルの書式
  30.      * <p>指定されない場合がある
  31.      */
  32.     private Optional<String> settingExcelPattern = Optional.empty();

  33.     public AbstractDateCellConverter(FieldAccessor field, Configuration config) {
  34.         super(field, config);
  35.     }

  36.     @Override
  37.     protected T parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {

  38.         if(evaluatedCell.getCellType().equals(CellType.NUMERIC)) {
  39.             return convertTypeValue(evaluatedCell.getDateCellValue());

  40.         } else if(!formattedValue.isEmpty()) {
  41.             // セルを文字列としてパースする
  42.             try {
  43.                 return textFormatter.parse(formattedValue);

  44.             } catch(TextParseException e) {
  45.                 throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue);
  46.             }
  47.         }

  48.         return null;

  49.     }

  50.     @Override
  51.     protected void setupCell(final Cell cell, final Optional<T> cellValue) throws TypeBindException {

  52.         // 書式を設定する
  53.         final CellStyleProxy cellStyle = new CellStyleProxy(cell);
  54.         cellStyle.setDataFormat(settingExcelPattern.orElse(null), defaultExcelPattern, getConfiguration().getCellFormatter());

  55.         if(cellValue.isPresent()) {
  56.             boolean isStartDate1904 = POIUtils.isDateStart1904(cell.getSheet().getWorkbook());
  57.             POIUtils.setCellValueAsDate(cell, cellValue.get(), isStartDate1904);

  58.         } else {
  59.             cell.setBlank();
  60.         }

  61.     }

  62.     /**
  63.      * その型における型に変換する
  64.      * @param date 変換対象の値
  65.      * @return 変換後の値
  66.      */
  67.     protected abstract T convertTypeValue(Date date);

  68.     /**
  69.      * デフォルトのExcelの書式を設定する
  70.      * @param defaultExcelPattern デフォルトのExcelの書式
  71.      */
  72.     public void setDefaultExcelPattern(String defaultExcelPattern) {
  73.         this.defaultExcelPattern = defaultExcelPattern;
  74.     }

  75.     /**
  76.      * アノテーションで指定されたExcelの書式を設定する。
  77.      * @param settingExcelPattern アノテーションで指定されたExcelの書式。空の場合もある。
  78.      */
  79.     public void setSettingExcelPattern(String settingExcelPattern) {

  80.         if(Utils.isEmpty(settingExcelPattern)) {
  81.             this.settingExcelPattern = Optional.empty();
  82.         } else {
  83.             this.settingExcelPattern = Optional.of(settingExcelPattern);
  84.         }
  85.     }


  86. }