package com.gh.mygreen.xlsmapper.cellconvert.converter; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import com.gh.mygreen.xlsmapper.POIUtils; import com.gh.mygreen.xlsmapper.Utils; import com.gh.mygreen.xlsmapper.XlsMapperConfig; import com.gh.mygreen.xlsmapper.XlsMapperException; import com.gh.mygreen.xlsmapper.annotation.XlsConverter; import com.gh.mygreen.xlsmapper.annotation.XlsDateConverter; import com.gh.mygreen.xlsmapper.annotation.XlsFormula; import com.gh.mygreen.xlsmapper.cellconvert.AbstractCellConverter; import com.gh.mygreen.xlsmapper.fieldprocessor.FieldAdaptor; /** * {@link Calendar}型の変換用クラス。 * * @since 1.5 * @author T.TSUCHIE * */ public class CalendarCellConverter extends AbstractCellConverter<Calendar> { private DateCellConverter dateConverter; public CalendarCellConverter() { this.dateConverter = new DateCellConverter(); } @Override public Calendar toObject(final Cell cell, final FieldAdaptor adaptor, final XlsMapperConfig config) throws XlsMapperException { final Date date = dateConverter.toObject(cell, adaptor, config); Calendar cal = null; if(date != null) { cal = Calendar.getInstance(); cal.setTime(date); } return cal; } @Override public Cell toCell(final FieldAdaptor adaptor, final Calendar targetValue, final Object targetBean, final Sheet sheet, final int column, final int row, final XlsMapperConfig config) throws XlsMapperException { final XlsConverter converterAnno = adaptor.getSavingAnnotation(XlsConverter.class); final XlsDateConverter anno = dateConverter.getSavingAnnotation(adaptor); final XlsFormula formulaAnno = adaptor.getSavingAnnotation(XlsFormula.class); final boolean primaryFormula = formulaAnno == null ? false : formulaAnno.primary(); final Cell cell = POIUtils.getCell(sheet, column, row); // セルの書式設定 if(converterAnno != null) { POIUtils.wrapCellText(cell, converterAnno.wrapText()); POIUtils.shrinkToFit(cell, converterAnno.shrinkToFit()); } Calendar value = targetValue; // デフォルト値から値を設定する if(value == null && Utils.hasDefaultValue(converterAnno)) { final String defaultValue = converterAnno.defaultValue(); final DateFormat formatter; if(Utils.isNotEmpty(anno.javaPattern())) { formatter = dateConverter.createDateFormat(anno); } else { formatter = dateConverter.createDateFormat(dateConverter.getDefaultDateConverterAnnotation()); } try { Date date = dateConverter.parseDate(defaultValue, formatter); Calendar cal = Calendar.getInstance(); cal.setTime(date); value = cal; } catch (ParseException e) { throw newTypeBindException(e, cell, adaptor, defaultValue) .addAllMessageVars(dateConverter.createTypeErrorMessageVars(anno)); } } // セルの書式の設定 if(Utils.isNotEmpty(anno.javaPattern())) { cell.getCellStyle().setDataFormat(POIUtils.getDataFormatIndex(sheet, anno.javaPattern())); } if(value != null && !primaryFormula) { cell.setCellValue(value); } else if(formulaAnno != null) { Utils.setupCellFormula(adaptor, formulaAnno, config, cell, targetBean); } else { cell.setCellType(Cell.CELL_TYPE_BLANK); } return cell; } }