AbstractTemporalCellConverter.java

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

  2. import java.time.temporal.TemporalAccessor;
  3. import java.util.Date;
  4. import java.util.Optional;

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

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


  15. /**
  16.  * JSR-310 'Date and Time API' の{@link TemporalAccessor}のテンプレートクラス。
  17.  * <p>基本的に、{@link TemporalAccessor}のサブクラスのビルダは、このクラスを継承して作成する。</p>
  18.  *
  19.  * @since 2.0
  20.  * @author T.TSUCHIE
  21.  *
  22.  */
  23. public abstract class AbstractTemporalCellConverter<T extends TemporalAccessor & Comparable<? super T>> extends BaseCellConverter<T> {

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

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

  34.     public AbstractTemporalCellConverter(final FieldAccessor field, final Configuration config) {
  35.         super(field, config);
  36.     }

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

  39.         if(evaluatedCell.getCellType().equals(CellType.NUMERIC)) {
  40.             return convertFromDate(evaluatedCell.getDateCellValue());

  41.         } else if(!formattedValue.isEmpty()) {

  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.             Date date = convertToDate(cellValue.get(), isStartDate1904);
  58.             POIUtils.setCellValueAsDate(cell, date, isStartDate1904);

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

  62.     }

  63.     /**
  64.      * 日時型から各タイプに変換する。
  65.      * @param date 日時型
  66.      * @return 変換した値
  67.      */
  68.     protected abstract T convertFromDate(Date date);

  69.     /**
  70.      * 日時型に変換する。
  71.      * @param value 変換対象の値
  72.      * @param dateStart1904 1904年始まりのシートかどうか
  73.      * @return 変換した値
  74.      */
  75.     protected abstract Date convertToDate(T value, boolean dateStart1904);

  76.     /**
  77.      * デフォルトのExcelの書式を設定する
  78.      * @param defaultExcelPattern デフォルトのExcelの書式
  79.      */
  80.     public void setDefaultExcelPattern(String defaultExcelPattern) {
  81.         this.defaultExcelPattern = defaultExcelPattern;
  82.     }

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

  88.         if(Utils.isEmpty(settingExcelPattern)) {
  89.             this.settingExcelPattern = Optional.empty();
  90.         } else {
  91.             this.settingExcelPattern = Optional.of(settingExcelPattern);
  92.         }
  93.     }

  94. }