CellStyleProxy.java
package com.gh.mygreen.xlsmapper.cellconverter;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import com.gh.mygreen.xlsmapper.CellFormatter;
import com.gh.mygreen.xlsmapper.util.ArgUtils;
import com.gh.mygreen.xlsmapper.util.POIUtils;
import com.gh.mygreen.xlsmapper.util.Utils;
/**
* セルのスタイルを管理するクラス。
* <p>既存のものを異なる設定をするならば、新しくする。</p>
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class CellStyleProxy {
private final Cell cell;
/**
* 既にスタイルを新しくしたかどうか。
*/
private boolean updated;
/**
* セルを指定してインスタンスを作成する。
* @param cell 管理対象のセル
* @throws IllegalArgumentException {@literal cell is null.}
*/
public CellStyleProxy(final Cell cell) {
ArgUtils.notNull(cell, "cell");
this.cell = cell;
this.updated = false;
}
private void cloneStyle() {
if(updated) {
// 既に更新済みの場合
return;
}
CellStyle style = cell.getSheet().getWorkbook().createCellStyle();
style.cloneStyleFrom(cell.getCellStyle());
cell.setCellStyle(style);
// 更新フラグをtrueにする
this.updated = true;
}
/**
* @return コンストラクタで渡したセルを取得します。
*/
public Cell getCell() {
return cell;
}
/**
* 折り返し設定を有効にする
*/
public void setWrapText() {
if(cell.getCellStyle().getWrapText()) {
// 既に有効な場合
return;
}
cloneStyle();
cell.getCellStyle().setShrinkToFit(false);
cell.getCellStyle().setWrapText(true);
}
/**
* 縮小して表示を有効にする
*/
public void setShrinkToFit() {
if(cell.getCellStyle().getShrinkToFit()) {
// 既に有効な場合
return;
}
cloneStyle();
cell.getCellStyle().setWrapText(false);
cell.getCellStyle().setShrinkToFit(true);
}
/**
* インデントを設定する
* @param indent インデントの値
*/
public void setIndent(final short indent) {
if(cell.getCellStyle().getIndention() == indent) {
// 既にインデントが同じ値
return;
}
cloneStyle();
cell.getCellStyle().setIndention(indent);
}
/**
* 横位置を設定する
* @param align 横位置
*/
public void setHorizontalAlignment(final HorizontalAlignment align) {
if(cell.getCellStyle().getAlignment().equals(align)) {
// 既に横位置が同じ値
return;
}
cloneStyle();
cell.getCellStyle().setAlignment(align);
}
/**
* 縦位置を設定する
* @param align 縦位置
*/
public void setVerticalAlignment(final VerticalAlignment align) {
if(cell.getCellStyle().getVerticalAlignment().equals(align)) {
// 既に縦位置が同じ値
return;
}
cloneStyle();
cell.getCellStyle().setVerticalAlignment(align);
}
/**
* 書式を設定する
* @param pattern 書式
*/
public void setDataFormat(final String pattern, final CellFormatter cellFormatter) {
String currentPattern = POIUtils.getCellFormatPattern(cell, cellFormatter);
if(currentPattern.equalsIgnoreCase(pattern)) {
// 既に書式が同じ場合
return;
}
cloneStyle();
cell.getCellStyle().setDataFormat(POIUtils.getDataFormatIndex(cell.getSheet(), pattern));
}
/**
* 書式を設定する。
* <p>設定使用とする書式がない場合は、セルの書式を優先する。
* <br>ただし、セルの書式も内場合は、デフォルトの書式を設定する。
* </p>
*
* @param settingPattern 設定しようとする書式(空の場合がある)
* @param defaultPattern デフォルトの書式
*/
public void setDataFormat(final String settingPattern, final String defaultPattern,
final CellFormatter cellFormatter) {
String currentPattern = POIUtils.getCellFormatPattern(cell, cellFormatter);
if(Utils.isNotEmpty(settingPattern)) {
// アノテーションで書式が指定されている場合、更新する
setDataFormat(settingPattern, cellFormatter);
} else if(currentPattern.isEmpty() || currentPattern.equalsIgnoreCase("general")) {
// セルの書式が設定されていない場合、デフォルトの値で更新する
setDataFormat(defaultPattern, cellFormatter);
}
}
}