package jp.co.test.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelProcess {
/**
* Excelファイルの読込
*
* @param file ファイル格納パス
* @return dataList 新規されたファイル
*/
public static List<List<Object>> readExcel(File file) throws IOException {
// ファイル名称を取得する
String fName = file.getName();
// ファイルの保存版本区分を取得する
String extension = fName.lastIndexOf(Constant.POINT) == -1 ? Constant.EMPTY : fName
.substring(fName.lastIndexOf(Constant.POINT) + 1);
// ファイルの保存類型によって、データの読込処理
if (Constant.EXCEL2003.equals(extension.toUpperCase())) {
// Excel2003の読込メソッド処理
return read2003Excel(file);
} else if (Constant.EXCEL2007.equals(extension.toUpperCase())) {
// Excel2007の読込メソッド処理
return read2007Excel(file);
} else {
// 異常処理
throw new IOException("不具合なファイル類型:" + extension);
}
}
/**
* Excel2003ファイルの読込処理
*
* @param file 選択されたファイル
* @return dataList データリスト
*/
public static List<List<Object>> read2003Excel(File file)
throws IOException {
// 戻るデータリストの初期化
List<List<Object>> dataList = new ArrayList<List<Object>>();
// 新規ワークブック
HSSFWorkbook workBook = new HSSFWorkbook(new FileInputStream(file));
// 新規シート
HSSFSheet sheet = workBook.getSheet(Constant.SHEET_NAME);
// 新規行
HSSFRow row = null;
// 新規列
HSSFCell cell = null;
// セルの値の変数
Object val = null;
// データフォーマット定義
DecimalFormat df = new DecimalFormat(Constant.DATA_FORMAT);
// 日付のフォーマット
SimpleDateFormat sdf = new SimpleDateFormat(Constant.DATA_FORMAT);
// 毎シートの行について、行番号が6から、最大行番号まで、毎行を読込する
for (int i = sheet.getFirstRowNum(); i < sheet.getLastRowNum(); i++) {
// 現在行を取得する、 不存在の場合、処理終了
row = sheet.getRow(i);
if (row == null) {
break;
}
List<Object> objList = new ArrayList<Object>();
// 毎行セルのindexについて、0から、セルの個数まで、毎列を読込する
for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
// 毎行のセルを取得
cell = row.getCell(j);
if (cell == null) {
val = null;
objList.add(val);
continue;
}
// セルのデータタイプによって、各メソッドで値を取得する
switch (cell.getCellType()) {
// 文字列
case HSSFCell.CELL_TYPE_STRING:
val = cell.getStringCellValue();
break;
// 数値
case HSSFCell.CELL_TYPE_NUMERIC:
if (Constant.EMAIL_DATA.equals(cell.getCellStyle().getDataFormatString())) {
val = df.format(cell.getNumericCellValue());
} else if (Constant.GENERAL_DATA.equals(cell.getCellStyle()
.getDataFormatString())) {
val = df.format(cell.getNumericCellValue());
} else {
val = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
// boolean類型
case HSSFCell.CELL_TYPE_BOOLEAN:
val = cell.getBooleanCellValue();
break;
// 空値
case HSSFCell.CELL_TYPE_BLANK:
val = Constant.EMPTY;
break;
default:
val = cell.toString();
break;
}
objList.add(val);
}
dataList.add(objList);
}
workBook.close();
return dataList;
}
/**
* Excelのヘッダー部の読込処理
*
* @param file
* @return
* @throws IOException
*/
public static String[] readExcelHead(File file) throws IOException {
// 新規ワークブック
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
// ワークシートを取得する
HSSFSheet sheet = wb.getSheet(Constant.SHEET_NAME);
// 行新規
HSSFRow row = null;
// セル新規
HSSFCell cell = null;
// ヘッダー部を取得する
row = sheet.getRow(Constant.CELL_INDEX);
String[] buff = new String[row.getLastCellNum()];
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
cell = row.getCell(i);
buff[i] = cell.getStringCellValue();
}
wb.close();
return buff;
}
/**
* 2007Excelの読込処理
*
* @param file
* @return
*/
public static List<List<Object>> read2007Excel(File file)
throws IOException {
// 戻るデータリストの初期化
List<List<Object>> dataList = new ArrayList<List<Object>>();
// 新規ワークブック
XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
// ワークシートを取得する
XSSFSheet sheet = xwb.getSheet(Constant.SHEET_NAME);
// 行新規
XSSFRow row = null;
// セル新規
XSSFCell cell = null;
Object val = null;
// データフォーマット定義
DecimalFormat df = new DecimalFormat(Constant.DATA_FORMAT);
// 日付のフォーマット
SimpleDateFormat sdf = new SimpleDateFormat(Constant.DATE_FORMAT);
// 毎シートの行について、行番号が6から、最大行番号まで、毎行を読込する
for (int i = sheet.getFirstRowNum(); i < sheet
.getPhysicalNumberOfRows(); i++) {
// 現在行を取得する、 不存在の場合、処理続き
row = sheet.getRow(i);
if (row == null) {
continue;
}
List<Object> objList = new ArrayList<Object>();
// 毎行セルのindexについて、0から、セルの個数まで、毎列を読込する
for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
// 毎行のセルを取得
cell = row.getCell(j);
if (cell == null) {
val = null;
objList.add(val);
continue;
}
// セルのデータタイプによって、各メソッドで値を取得する
switch (cell.getCellType()) {
// 文字列
case XSSFCell.CELL_TYPE_STRING:
val = cell.getStringCellValue();
break;
// 数値
case XSSFCell.CELL_TYPE_NUMERIC:
if (Constant.EMAIL_DATA.equals(cell.getCellStyle().getDataFormatString())) {
val = df.format(cell.getNumericCellValue());
} else if (Constant.GENERAL_DATA.equals(cell.getCellStyle()
.getDataFormatString())) {
val = df.format(cell.getNumericCellValue());
} else {
val = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
// boolean類型
case XSSFCell.CELL_TYPE_BOOLEAN:
val = cell.getBooleanCellValue();
break;
// 空値
case XSSFCell.CELL_TYPE_BLANK:
val = Constant.EMPTY;
break;
default:
val = cell.toString();
break;
}
objList.add(val);
}
dataList.add(objList);
}
xwb.close();
return dataList;
}
}