/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.common.common;

import java.io.FileInputStream;
import jp.getset.gae.driver.java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**
 * Poiによる帳票作成機能を提供する。<br><br>
 * Excelで帳票を作成する際に有用なライブラリーをMosPフレームワーク内で利用する。
 */
public class PoiUtility {
	//****************************************************************************
	//変数宣言0
	//****************************************************************************

	HSSFWorkbook workbook = null;
	FileInputStream in = null;
	POIFSFileSystem fs = null;
	FileOutputStream out = null;
	HSSFSheet sheet = null;
	HSSFCellStyle style = null;
	HSSFRow row;
	HSSFCell cell;

	HSSFFont font;

	//****************************************************************************
	//色宣言
	//****************************************************************************
	public static final short AQUA 					= HSSFColor.AQUA.index;
	public static final short BLACK 					= HSSFColor.BLACK.index;
	public static final short BLUE 					= HSSFColor.BLUE.index;
	public static final short BLUE_GREY 				= HSSFColor.BLUE_GREY.index;
	public static final short BRIGHT_GREEN 			= HSSFColor.BRIGHT_GREEN.index;
	public static final short BROWN 					= HSSFColor.BROWN.index;
	public static final short CORAL 					= HSSFColor.CORAL.index;
	public static final short CORNFLOWER_BLUE 		= HSSFColor.CORNFLOWER_BLUE.index;
	public static final short DARK_BLUE 				= HSSFColor.DARK_BLUE.index;
	public static final short DARK_GREEN 				= HSSFColor.DARK_GREEN.index;
	public static final short DARK_RED 				= HSSFColor.DARK_RED.index;
	public static final short DARK_TEAL 				= HSSFColor.DARK_TEAL.index;
	public static final short DARK_YELLOW 			= HSSFColor.DARK_YELLOW.index;
	public static final short GOLD 					= HSSFColor.GOLD.index;
	public static final short GREEN 					= HSSFColor.GREEN.index;
	public static final short GREY_25_PERCENT 		= HSSFColor.GREY_25_PERCENT.index;
	public static final short GREY_40_PERCENT 		= HSSFColor.GREY_40_PERCENT.index;
	public static final short GREY_50_PERCENT 		= HSSFColor.GREY_50_PERCENT.index;
	public static final short GREY_80_PERCENT 		= HSSFColor.GREY_80_PERCENT.index;
	public static final short INDIGO 					= HSSFColor.INDIGO.index;
	public static final short LAVENDER 				= HSSFColor.LAVENDER.index;
	public static final short LEMON_CHIFFON 			= HSSFColor.LEMON_CHIFFON.index;
	public static final short LIGHT_BLUE 				= HSSFColor.LIGHT_BLUE.index;
	public static final short LIGHT_CORNFLOWER_BLUE 	= HSSFColor.LIGHT_CORNFLOWER_BLUE.index;
	public static final short LIGHT_GREEN 			= HSSFColor.LIGHT_GREEN.index;
	public static final short LIGHT_ORANGE 			= HSSFColor.LIGHT_ORANGE.index;
	public static final short LIGHT_TURQUOISE 		= HSSFColor.LIGHT_TURQUOISE.index;
	public static final short LIGHT_YELLOW 			= HSSFColor.LIGHT_YELLOW.index;
	public static final short LIME 					= HSSFColor.LIME.index;
	public static final short MAROON 					= HSSFColor.MAROON.index;
	public static final short OLIVE_GREEN 			= HSSFColor.OLIVE_GREEN.index;
	public static final short ORANGE 					= HSSFColor.ORANGE.index;
	public static final short ORCHID 					= HSSFColor.ORCHID.index;
	public static final short PALE_BLUE 				= HSSFColor.PALE_BLUE.index;
	public static final short PINK 					= HSSFColor.PINK.index;
	public static final short PLUM 					= HSSFColor.PLUM.index;
	public static final short RED 					= HSSFColor.RED.index;
	public static final short ROSE 					= HSSFColor.ROSE.index;
	public static final short ROYAL_BLUE 				= HSSFColor.ROYAL_BLUE.index;
	public static final short SEA_GREEN 				= HSSFColor.SEA_GREEN.index;
	public static final short SKY_BLUE 				= HSSFColor.SKY_BLUE.index;
	public static final short TAN 					= HSSFColor.TAN.index;
	public static final short TEAL 					= HSSFColor.TEAL.index;
	public static final short TURQUOISE 				= HSSFColor.TURQUOISE.index;
	public static final short VIOLET 					= HSSFColor.VIOLET.index;
	public static final short WHITE 					= HSSFColor.WHITE.index;
	public static final short YELLOW 					= HSSFColor.YELLOW.index;

	//****************************************************************************
	//塗りつぶしパターン宣言
	//****************************************************************************
	public static final short NO_FILL 				= HSSFCellStyle.NO_FILL;
	public static final short SOLID_FOREGROUND 		= HSSFCellStyle.SOLID_FOREGROUND;
	public static final short FINE_DOTS 				= HSSFCellStyle.FINE_DOTS;
	public static final short ALT_BARS 				= HSSFCellStyle.ALT_BARS;
	public static final short SPARSE_DOTS 			= HSSFCellStyle.SPARSE_DOTS;
	public static final short THICK_HORZ_BANDS 		= HSSFCellStyle.THICK_HORZ_BANDS;
	public static final short THICK_VERT_BANDS 		= HSSFCellStyle.THICK_VERT_BANDS;
	public static final short THICK_BACKWARD_DIAG 	= HSSFCellStyle.THICK_BACKWARD_DIAG;
	public static final short THICK_FORWARD_DIAG 		= HSSFCellStyle.THICK_FORWARD_DIAG;
	public static final short BIG_SPOTS 				= HSSFCellStyle.BIG_SPOTS;
	public static final short BRICKS 					= HSSFCellStyle.BRICKS;
	public static final short THIN_HORZ_BANDS 		= HSSFCellStyle.THIN_HORZ_BANDS;
	public static final short THIN_VERT_BANDS 		= HSSFCellStyle.THIN_VERT_BANDS;
	public static final short THIN_BACKWARD_DIAG 		= HSSFCellStyle.THIN_BACKWARD_DIAG;
	public static final short THIN_FORWARD_DIAG 		= HSSFCellStyle.THIN_FORWARD_DIAG;
	public static final short SQUARES 				= HSSFCellStyle.SQUARES;
	public static final short DIAMONDS 				= HSSFCellStyle.DIAMONDS;

	//****************************************************************************
	//フォント宣言
	//****************************************************************************
	public static final String MS_GOTHIC				= "ＭＳ ゴシック";
	public static final String MS_P_MINTYO			= "ＭＳ Ｐ明朝";
	public static final String MS_MINTYO				= "ＭＳ 明朝";

	//****************************************************************************
	//ボーダー宣言
	//****************************************************************************
	public static final short BORDER_DOTTED			= HSSFCellStyle.BORDER_DOTTED;
	public static final short BORDER_THIN				= HSSFCellStyle.BORDER_THIN;

	//****************************************************************************
	//書式宣言
	//****************************************************************************
	/**
	 * 書式	text、@
	 */
	public static final short DATA_FORMAT_TEXT 		= 0x31;

	/**
	 * 書式	h:mm AM/PM
	 */
	public static final short DATA_FORMAT_TIME1 		= 0x12;

	/**
	 * 書式	h:mm:ss AM/PM
	 */
	public static final short DATA_FORMAT_TIME2 		= 0x13;

	/**
	 * 書式	h:mm
	 */
	public static final short DATA_FORMAT_TIME3 		= 0x14;

	/**
	 * 書式	h:mm:ss
	 */
	public static final short DATA_FORMAT_TIME4 		= 0x15;

	/**
	 * 書式	mm:ss
	 */
	public static final short DATA_FORMAT_TIME5 		= 0x2d;

	/**
	 * 書式	[h]:mm:ss
	 */
	public static final short DATA_FORMAT_TIME6 		= 0x2e;

	/**
	 * 書式	mm:ss.0
	 */
	public static final short DATA_FORMAT_TIME7 		= 0x2f;

	/**
	 * 書式	yyyy mm dd
	 */
	public static final String DATA_FORMAT_DATE1		= "yyyy mm dd";

	/**
	 * 書式	yyyy/mm/dd
	 */
	public static final String DATA_FORMAT_DATE2		= "yyyy/mm/dd";

	/**
	 * 書式	yyyy-mm-dd
	 */
	public static final String DATA_FORMAT_DATE3		= "yyyy-mm-dd";

	/**
	 * 書式	0
	 */
	public static final short DATA_FORMAT_INTEGER		= 1;

	/**
	 * 書式	0.00
	 */
	public static final short DATA_FORMAT_DOUBLE 		= 2;

	/**
	 * 書式	0%
	 */
	public static final short DATA_FORMAT_PERSENT 	= 9;

	/**
	 * 書式	0.00%
	 */
	public static final short DATA_FORMAT_PERSENT1 	= 0xa;

	//****************************************************************************
	//印刷データ変数宣言
	//****************************************************************************

	//****************************************************************************
	//コンストラクタ
	//****************************************************************************
	/**
	 * コンストラクタ。<br>
	 */
	public PoiUtility() {
		// 処理無し
	}

	//****************************************************************************
	//新しい頁作成メソッド  
	//****************************************************************************
	/**
	 *  新しい頁作成メソッド。<br>  
	 */
	public void crtNewDoc(int shno, String shname) throws Exception {
		try{
			workbook = new HSSFWorkbook();
			sheet = workbook.createSheet();
			workbook.setSheetName(shno, shname, HSSFWorkbook.ENCODING_UTF_16);
			sheet.setSelected(true);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//新しい頁作成メソッド  参照による
	//****************************************************************************
	/**
	 *  新しい頁作成メソッド  (参照用)。<br>
	 */
	public void crtNewDocR(int shno, String file1) throws Exception {
		try{
			in = new FileInputStream(file1);
			fs = new POIFSFileSystem(in);
			workbook = new HSSFWorkbook(fs);
		} catch(IOException e) {
			e.printStackTrace();
			throw e;
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				throw e;
			}
		}
		sheet = workbook.getSheetAt(shno);
		sheet.setSelected(true);
	}

	//****************************************************************************
	//新しいシート作成メソッド
	//****************************************************************************
	/**
	 *  新しいシート作成メソッド。<br>
	 */

	public void selSheet(int shno) throws Exception {
		sheet = workbook.getSheetAt(shno);
		sheet.setSelected(true);
	}

	//****************************************************************************
	//新しいシート作成メソッド
	//****************************************************************************
	/**
	 *  新しいシート作成メソッド。<br>
	 */
	public void crtSheet(int newno, String shnm) throws Exception {
		try{
			workbook.createSheet();
			workbook.setSheetName(newno, shnm);
		} catch(Exception e) {
			throw e;
		}
		sheet = workbook.getSheetAt(newno);
		sheet.setSelected(true);
	}

	//****************************************************************************
	//新しいシート作成メソッド  参照による
	//****************************************************************************
	/**
	 *  新しいシート作成メソッド  (参照用)。<br>
	 */

	public void clnSheet(int shno, int newno, String shnm) throws Exception {
		try{
			workbook.cloneSheet(shno);
			workbook.setSheetName(newno, shnm);
		} catch(Exception e) {
			throw e;
		}
		sheet = workbook.getSheetAt(newno);
		sheet.setSelected(true);
	}

	//****************************************************************************
	//シート削除メソッド
	//****************************************************************************
	/**
	 *  シート削除メソッド。<br>
	 */
	public void rmvSheet(int shno) throws Exception {
		try{
			workbook.removeSheetAt(shno);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//シート設定メソッド　
	//****************************************************************************
	/**
	 * セル幅設定
	 * @param columnNo		column番号
	 * @param number		文字数
	 */
	public void setColumnWidth(int columnNo, int number) {
		short width = (short)(number * 256);
		sheet.setColumnWidth((short)columnNo, width);
	}

	/**
	 * シートデフォルトセル幅設定
	 * @param number	文字数
	 */
	public void setDefaultColumnWidth(int number) {
		sheet.setDefaultColumnWidth((short)number);
	}

	/**
	 * 表示倍率変更
	 * @param magnification		表示倍率（％）
	 */
	public void setZoom(int magnification) {
		if (magnification > 0) {
			sheet.setZoom(magnification, 100);
		}
	}

	/**
	 * シート名変更
	 * @param sheetno		シート番号
	 * @param sheetname		変更後シート名
	 */
	public void setSheetName(int sheetno, String sheetname) {
		workbook.setSheetName(sheetno, sheetname, HSSFWorkbook.ENCODING_UTF_16);
	}

	//****************************************************************************
	//ドキュメント出力メソッド
	//****************************************************************************
	/**
	 *  ドキュメント出力メソッド。<br>
	 */
	public void outputDoc(String file) throws Exception {
		// ファイルを開いて，ドキュメントを出力する
		try{
			out = new FileOutputStream(file);
			workbook.write(out);
		} catch(IOException e) {
			throw e;
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				throw e;
			}
		}
	}   

	//****************************************************************************
	//項目消去メソッド
	//****************************************************************************
	/**
	 *  項目消去メソッド。<br>
	 */
	public void clrCell(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			cell = row.getCell((short)cc);
		} catch(Exception e) {
			throw e;
		}
		cell.setCellValue("");
	}

	//****************************************************************************
	//行読込メソッド
	//****************************************************************************
	/**
	 *  行読込メソッド。<br>
	 */

	public void getRow(int rr) throws Exception {
		try{
			row = sheet.getRow(rr);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//行作成メソッド
	//****************************************************************************
	/**
	 *  行作成メソッド。<br>
	 */
	public void crtRow(int rr) throws Exception {
		try{
			row = sheet.createRow(rr);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//行削除メソッド
	//****************************************************************************
	/**
	 *  行削除メソッド。<br>
	 */
	public void dltRow(int rr) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				sheet.removeRow(row);
			}
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//行削除メソッド
	//****************************************************************************
	/**
	 *  行シフトメソッド。<br>
	 */
	public void shiftRows(int rr) throws Exception {
		try{
			sheet.shiftRows(rr,sheet.getLastRowNum(),-1);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｓｔｒｉｎｇ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(String)。<br>
	 */
	public void prtItem(int rr, int cc, String sdata) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(sdata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｉｎｔｅｇｅｒ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(int)。<br>
	 */
	public void prtItem(int rr, int cc, int idata) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			cell.setCellValue(idata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｄｏｕｂｌｅ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(double)。<br>
	 */
	public void prtItem(int rr, int cc, double ddata) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			cell.setCellValue(ddata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル読込メソッド　Ｓｔｒｉｎｇ
	//****************************************************************************
	/**
	 *  セル読込メソッド(String)1。<br>
	 */
	public String getsItem(int cc){
		try{
			cell = row.getCell((short)cc);
			if (cell != null) {
				return cell.getStringCellValue();
			}
			return "*";
		} catch(Exception e) {
			return "*";
		}
	}

	//****************************************************************************
	//セル読込メソッド　Ｓｔｒｉｎｇ
	//****************************************************************************
	/**
	 *  セル読込メソッド(String)2。<br>
	 */
	public String getsItem(int rr, int cc){
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				cell = row.getCell((short)cc);
				if (cell != null) {
					return cell.getStringCellValue();
				}
				return "*";
			}
			return "*";
		} catch(Exception e) {
			return "*";
		}
	}

	//****************************************************************************
	//セル読込メソッド　Ｉｎｔｅｇｅｒ
	//****************************************************************************
	/**
	 *  セル読込メソッド(int)。<br>
	 */

	public int getiItem(int rr, int cc){
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				cell = row.getCell((short)cc);
				if (cell != null) {
					return (int)cell.getNumericCellValue();
				}
				return 0;
			}
			return 0;
		} catch(Exception e) {
			return 0;
		}
	}

	//****************************************************************************
	//セル読込メソッド　Ｄｏｕｂｌｅ
	//****************************************************************************
	/**
	 *  セル読込メソッド(double)。<br>
	 */
	public double getdItem(int rr, int cc){
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				cell = row.getCell((short)cc);
				if (cell != null) {
					return cell.getNumericCellValue();
				}
				return 0;
			}
			return 0;
		} catch(Exception e) {
			return 0.0;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｓｔｒｉｎｇ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(String)。<br>
	 */
	public void wrtItem(int cc, String sdata) throws Exception {
		try{
			cell = row.createCell((short)cc);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(sdata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｉｎｔｅｇｅｒ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(int)。<br>
	 */
	public void wrtItem(int cc, int idata) throws Exception {
		try{
			cell = row.createCell((short)cc);
			cell.setCellValue(idata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル印刷メソッド　Ｄｏｕｂｌｅ
	//****************************************************************************
	/**
	 *  セル印刷メソッド(double)。<br>
	 */
	public void wrtItem(int cc, double ddata) throws Exception {
		try{
			cell = row.createCell((short)cc);
			cell.setCellValue(ddata);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セルスタイル複写メソッド　CellStyle
	//****************************************************************************
	/**
	 *  セルスタイル複写メソッド。<br>
	 */
	public void clnCellStyle(int rr, int cc, int tr, int tc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				cell = row.getCell((short)cc);
				if (cell != null) {
					style = cell.getCellStyle();
					setCellStyle(tr, tc);
				}
			}
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セルスタイルセットメソッド　CellStyle
	//****************************************************************************
	/**
	 *  セルスタイルセットメソッド。<br>
	 */
	public void setCellStyle(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row != null) {
				cell = row.getCell((short)cc);
				if (cell != null) {
					cell.setCellStyle(style);
				}
			}
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル罫線印刷メソッド　BorderTop
	//****************************************************************************
	/**
	 *  セル罫線印刷メソッド。<br>
	 */
	public void prtBorderTop(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			style = workbook.createCellStyle();
			style.setBorderTop(HSSFCellStyle.BORDER_THIN);
			cell.setCellStyle(style);
			cell.setCellValue("");
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル罫線印刷メソッド　BorderBottom
	//****************************************************************************
	/**
	 *  セル罫線印刷メソッド。<br>
	 */
	public void prtBorderBottom(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			style = workbook.createCellStyle();
			style.setBorderBottom(HSSFCellStyle.BORDER_DASHED);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル金額円印刷メソッド　Format("#,##0")
	//****************************************************************************
	/**
	 *  セル金額円印刷メソッド。<br>
	 */
	public void setCellYen(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			style = workbook.createCellStyle();
			style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));
			cell.setCellStyle(style);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル日付形式メソッド
	//****************************************************************************
	/**
	 *  セル日付形式メソッド。<br>
	 */
	public void setCellStyleDateFormat(int rr, int cc) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			style = workbook.createCellStyle();
//			style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
			HSSFDataFormat dformat = workbook.createDataFormat();
//			style.setDataFormat(dformat.getFormat("yyyy年mm月dd日"));
			style.setDataFormat(dformat.getFormat("yyyy mm dd"));
			cell.setCellStyle(style);
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル結合メソッド　addMergedRegion
	//****************************************************************************
	/**
	 * セル結合メソッド。<br>
	 */
	public void addMergedRegion(int rrf, int ccf, int rrt, int cct) throws Exception {
		try{
			sheet.addMergedRegion(new Region(rrf, (short)ccf, rrt, (short)cct));
		} catch(Exception e) {
			throw e;
		}
	}

	//****************************************************************************
	//セル背景色設定メソッド　setCellBgColor
	//****************************************************************************
	/**
	 * セルの背景色設定
	 * @param bgColor	{@link PoiUtility}の色
	 */
	public void setCellBgColor(short bgColor) {
		style.setFillForegroundColor(bgColor);
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	}

	/**
	 * セルの背景色設定（塗りつぶし指定）
	 * @param bgColor	{@link PoiUtility}の色
	 * @param pattern	{@link PoiUtility}のパターン
	 */
	public void setCellBgColor(short bgColor, short pattern) {
		style.setFillForegroundColor(bgColor);
		style.setFillPattern(pattern);
	}

	//****************************************************************************
	//フォント色設定メソッド　setCellFontColor
	//****************************************************************************
	/**
	 * フォント色設定
	 * @param fontColor		{@link PoiUtility}の色
	 */
	public void setCellFontColor(short fontColor) {
		font.setColor(fontColor);
	}

	//****************************************************************************
	//フォント設定メソッド　setFont
	//****************************************************************************
	/**
	 * 横方向中央寄せ
	 */
	public void setFontHAlignCenter() {
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
	}

	/**
	 * 左寄せ
	 */
	public void setFontHAlignLeft() {
		style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
	}

	/**
	 * 右寄せ
	 */
	public void setFontHAlignRight() {
		style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
	}

	/**
	 * 縦方向中央寄せ
	 */
	public void setFontVAlighCenter() {
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
	}

	/**
	 * セルの文字列を折り返して全体を表示
	 */
	public void setWrapText() {
		style.setWrapText(true);
	}

	/**
	 * フォントサイズ設定
	 * @param size	フォントサイズ
	 */
	public void setFontSize(int size) {
		font.setFontHeightInPoints((short)size);
	}

	/**
	 * フォント種類設定
	 * @param fontName	フォント名
	 */
	public void setFontType(String fontName) {
		font.setFontName(fontName);
	}

	/**
	 * 太字設定
	 */
	public void setFontWeightBold() {
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
	}

	//****************************************************************************
	//セル背景色・フォント色設定メソッド　setCellColorCoordinate
	//****************************************************************************
	/**
	 * セルとフォントの色指定
	 * @param bgColor		{@link PoiUtility}の色
	 * @param fontColor		{@link PoiUtility}の色
	 */
	public void setCellColorCoordinate(short bgColor, short fontColor) {
		setCellBgColor(bgColor);
		setCellFontColor(fontColor);
	}

	/**
	 * セルとフォントの色指定（塗りつぶし指定）
	 * @param bgColor		{@link PoiUtility}の色
	 * @param fontColor		{@link PoiUtility}の色
	 * @param pattern		{@link PoiUtility}のパターン
	 */
	public void setCellColorCoordinate(short bgColor, short fontColor, short pattern) {
		setCellBgColor(bgColor, pattern);
		setCellFontColor(fontColor);
	}

	//****************************************************************************
	//セルボーダー色・種類設定メソッド　setBorder
	//****************************************************************************
	/**
	 * セルボーダー設定
	 * @param borderStyle	ボーダータイプ
	 * @param borderColor	ボーダー色
	 */
	public void setBorderAround(short borderStyle, short borderColor) {
		setBorderTop(borderStyle, borderColor);
		setBorderRight(borderStyle, borderColor);
		setBorderBottom(borderStyle, borderColor);
		setBorderLeft(borderStyle, borderColor);
	}

	/**
	 * 黒点字ボーダーセル
	 */
	public void setBorderAroundDotted() {
		setBorderAround(BORDER_DOTTED, BLACK);
	}

	/**
	 * 上側ボーダー設定
	 * @param borderStyle	ボーダータイプ
	 * @param borderColor	ボーダー色
	 */
	public void setBorderTop(short borderStyle, short borderColor) {
		style.setBorderTop(borderStyle);		
		style.setTopBorderColor(borderColor);
	}

	/**
	 * 右側ボーダー設定
	 * @param borderStyle	ボーダータイプ
	 * @param borderColor	ボーダー色
	 */
	public void setBorderRight(short borderStyle, short borderColor) {
		style.setBorderRight(borderStyle);		
		style.setRightBorderColor(borderColor);
	}

	/**
	 * 下側ボーダー設定
	 * @param borderStyle	ボーダータイプ
	 * @param borderColor	ボーダー色
	 */
	public void setBorderBottom(short borderStyle, short borderColor) {
		style.setBorderBottom(borderStyle);		
		style.setBottomBorderColor(borderColor);
	}

	/**
	 * 左側ボーダー設定
	 * @param borderStyle	ボーダータイプ
	 * @param borderColor	ボーダー色
	 */
	public void setBorderLeft(short borderStyle, short borderColor) {
		style.setBorderLeft(borderStyle);		
		style.setLeftBorderColor(borderColor);
	}

	//****************************************************************************
	//初期化メソッド　
	//****************************************************************************
	/**
	 * スタイル設定生成
	 * <p>
	 * メソッド実行後、{@link PoiUtility#prtItem(int, int, String)}等を実行した後、<br>
	 * 必ず{@link PoiUtility#reflectCellStyleNoFont()}を実行してください。
	 * </p>
	 */
	public void createCellStyle() {
		style = workbook.createCellStyle();
	}

	/**
	 * フォント設定生成
	 */
	private void createFont() {
		font = workbook.createFont();
	}

	/**
	 * スタイル・フォント設定生成
	 * <p>
	 * メソッド実行後、{@link PoiUtility#prtItem(int, int, String)}等を実行した後、<br>
	 * 必ず{@link PoiUtility#reflectCellStyle()}を実行してください。
	 * </p>
	 */
	public void createCellStyleAndFont() {
		createCellStyle();
		createFont();
	}

	//****************************************************************************
	//スタイルメソッド　
	//****************************************************************************
	/**
	 * セル印刷設定
	 * @param rr			row番号
	 * @param cc			cell番号
	 * @param sdata			Stringデータ
	 * @param isStyle		スタイルの利用可否（フォント設定有り）
	 * @throws Exception
	 * <p>
	 * isStyleがtrueの場合、実行後スタイルを設定し、<br>
	 * 必ず{@link PoiUtility#reflectCellStyle()}を実行してください。
	 * </p>
	 */
	public void prtItem(int rr, int cc, String sdata, boolean isStyle) throws Exception {
		try{
			row = sheet.getRow(rr);
			if (row == null) {
				crtRow(rr);    //行追加
			}
			cell = row.getCell((short)cc);
			if (cell == null) {
				cell = row.createCell((short)cc);    //セル追加
			}
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(sdata);
			if (isStyle) {
				createCellStyleAndFont();
			}
		} catch(Exception e) {
			throw e;
		}
	}

	/**
	 * 書式設定
	 * @param format	書式タイプ
	 */
	public void setDataFormat(short format) {
		style.setDataFormat(format);
	}

	/**
	 * 書式設定
	 * @param type		書式タイプ
	 */
	public void setDataFormat(String type) {
		HSSFDataFormat dformat = workbook.createDataFormat();
		style.setDataFormat(dformat.getFormat(type));
	}

	/**
	 * スタイル反映
	 * <p>
	 * スタイルを設定した場合、必ずこのメソッドを実行してください。
	 * </p>
	 */
	public void reflectCellStyle(){
		style.setFont(font);
		cell.setCellStyle(style);
	}

	/**
	 * スタイル反映(フォント設定無し)
	 * <p>
	 * スタイルを設定(フォント設定無し)した場合、必ずこのメソッドを実行してください。
	 * </p>
	 */
	public void reflectCellStyleNoFont(){
		cell.setCellStyle(style);
	}

	//****************************************************************************
	//最初行取得メソッド　
	//****************************************************************************
	/**
	 * 最初行取得メソッド。<br>
	 */
	public int getFirstRow(){
		return sheet.getFirstRowNum();      //最初行取得
	}

	//****************************************************************************
	//最終行取得メソッド　
	//****************************************************************************
	/**
	 *最終行取得メソッド。<br>
	 */
	public int getLastRow(){
		return sheet.getLastRowNum();      //最終行取得
	}


	//****************************************************************************
	//印刷範囲の設定メソッド　
	//****************************************************************************
	/**
	 *印刷範囲の設定メソッド。<br>
	 */

	public void setPrintArea(int shno, int strcc,int endcc,int strrr,int endrr) {
		workbook.removePrintArea(shno);	  
		workbook.setPrintArea(shno, strcc, endcc, strrr, endrr);	  
	}
	//****************************************************************************


	//****************************************************************************
	//印刷範囲の設定メソッド　
	//****************************************************************************
	/**
	 *印刷範囲の設定メソッド。<br>
	 */
	public void setPrintArea(int shno, String printa) {
		workbook.removePrintArea(shno);	  
		workbook.setPrintArea(shno, printa);	  
	}
	//****************************************************************************

	//****************************************************************************
	//Workbookを返却するメソッド
	/**
	 * Workbookを返却するメソッド。<br>
	 */
	//****************************************************************************
	public HSSFWorkbook getWorkbook() {
		return workbook;
	}
	//****************************************************************************

}
