CellStyleProxy.java

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

  2. import org.apache.poi.ss.usermodel.Cell;
  3. import org.apache.poi.ss.usermodel.CellStyle;
  4. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  5. import org.apache.poi.ss.usermodel.VerticalAlignment;

  6. import com.gh.mygreen.xlsmapper.CellFormatter;
  7. import com.gh.mygreen.xlsmapper.util.ArgUtils;
  8. import com.gh.mygreen.xlsmapper.util.POIUtils;
  9. import com.gh.mygreen.xlsmapper.util.Utils;

  10. /**
  11.  * セルのスタイルを管理するクラス。
  12.  * <p>既存のものを異なる設定をするならば、新しくする。</p>
  13.  *
  14.  * @since 2.0
  15.  * @author T.TSUCHIE
  16.  *
  17.  */
  18. public class CellStyleProxy {

  19.     private final Cell cell;

  20.     /**
  21.      * 既にスタイルを新しくしたかどうか。
  22.      */
  23.     private boolean updated;

  24.     /**
  25.      * セルを指定してインスタンスを作成する。
  26.      * @param cell 管理対象のセル
  27.      * @throws IllegalArgumentException {@literal cell is null.}
  28.      */
  29.     public CellStyleProxy(final Cell cell) {
  30.         ArgUtils.notNull(cell, "cell");

  31.         this.cell = cell;
  32.         this.updated = false;
  33.     }

  34.     private void cloneStyle() {
  35.         if(updated) {
  36.             // 既に更新済みの場合
  37.             return;
  38.         }

  39.         CellStyle style = cell.getSheet().getWorkbook().createCellStyle();
  40.         style.cloneStyleFrom(cell.getCellStyle());
  41.         cell.setCellStyle(style);

  42.         // 更新フラグをtrueにする
  43.         this.updated = true;
  44.     }

  45.     /**
  46.      * @return コンストラクタで渡したセルを取得します。
  47.      */
  48.     public Cell getCell() {
  49.         return cell;
  50.     }

  51.     /**
  52.      * 折り返し設定を有効にする
  53.      */
  54.     public void setWrapText() {
  55.         if(cell.getCellStyle().getWrapText()) {
  56.             // 既に有効な場合
  57.             return;
  58.         }

  59.         cloneStyle();
  60.         cell.getCellStyle().setShrinkToFit(false);
  61.         cell.getCellStyle().setWrapText(true);
  62.     }

  63.     /**
  64.      * 縮小して表示を有効にする
  65.      */
  66.     public void setShrinkToFit() {
  67.         if(cell.getCellStyle().getShrinkToFit()) {
  68.             // 既に有効な場合
  69.             return;
  70.         }

  71.         cloneStyle();
  72.         cell.getCellStyle().setWrapText(false);
  73.         cell.getCellStyle().setShrinkToFit(true);
  74.     }

  75.     /**
  76.      * インデントを設定する
  77.      * @param indent インデントの値
  78.      */
  79.     public void setIndent(final short indent) {

  80.         if(cell.getCellStyle().getIndention() == indent) {
  81.             // 既にインデントが同じ値
  82.             return;
  83.         }

  84.         cloneStyle();
  85.         cell.getCellStyle().setIndention(indent);

  86.     }

  87.     /**
  88.      * 横位置を設定する
  89.      * @param align 横位置
  90.      */
  91.     public void setHorizontalAlignment(final HorizontalAlignment align) {

  92.         if(cell.getCellStyle().getAlignment().equals(align)) {
  93.             // 既に横位置が同じ値
  94.             return;
  95.         }

  96.         cloneStyle();
  97.         cell.getCellStyle().setAlignment(align);
  98.     }

  99.     /**
  100.      * 縦位置を設定する
  101.      * @param align 縦位置
  102.      */
  103.     public void setVerticalAlignment(final VerticalAlignment align) {

  104.         if(cell.getCellStyle().getVerticalAlignment().equals(align)) {
  105.             // 既に縦位置が同じ値
  106.             return;
  107.         }

  108.         cloneStyle();
  109.         cell.getCellStyle().setVerticalAlignment(align);
  110.     }

  111.     /**
  112.      * 書式を設定する
  113.      * @param pattern 書式
  114.      */
  115.     public void setDataFormat(final String pattern, final CellFormatter cellFormatter) {

  116.         String currentPattern = POIUtils.getCellFormatPattern(cell, cellFormatter);
  117.         if(currentPattern.equalsIgnoreCase(pattern)) {
  118.             // 既に書式が同じ場合
  119.             return;
  120.         }

  121.         cloneStyle();
  122.         cell.getCellStyle().setDataFormat(POIUtils.getDataFormatIndex(cell.getSheet(), pattern));

  123.     }

  124.     /**
  125.      * 書式を設定する。
  126.      * <p>設定使用とする書式がない場合は、セルの書式を優先する。
  127.      *  <br>ただし、セルの書式も内場合は、デフォルトの書式を設定する。
  128.      * </p>
  129.      *
  130.      * @param settingPattern 設定しようとする書式(空の場合がある)
  131.      * @param defaultPattern デフォルトの書式
  132.      */
  133.     public void setDataFormat(final String settingPattern, final String defaultPattern,
  134.             final CellFormatter cellFormatter) {

  135.         String currentPattern = POIUtils.getCellFormatPattern(cell, cellFormatter);

  136.         if(Utils.isNotEmpty(settingPattern)) {
  137.             // アノテーションで書式が指定されている場合、更新する
  138.             setDataFormat(settingPattern, cellFormatter);

  139.         } else if(currentPattern.isEmpty() || currentPattern.equalsIgnoreCase("general")) {
  140.             // セルの書式が設定されていない場合、デフォルトの値で更新する
  141.             setDataFormat(defaultPattern, cellFormatter);

  142.         }

  143.     }

  144. }