import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
/**
* Excel Read 한다. xls, xlsx 가능
* ex) ExcelGenerator.excelToList(new File("path..xls,xlsx");
* ExcelGenerator.excelToList(new File("path..xls,xlsx", new Integer[]{x, y, width, height});
* ExcelGenerator.excelToList(new File("path..xls,xlsx", x, y, width, height);
* java.awt.Rectangle(int x, int y, int width, int height) 와 같은 형태로 왼쪽 위 모서리 좌표와, 오른쪽 아래 모서리 좌표 정보
* @author ddakker
* @version 1.0
* @date 2012.05.04
*
*/
public class ExcelGenerator {
private static final Log logger = LogFactory.getLog(ExcelGenerator.class);
public static Object[][] excelToList(File file ) throws Exception {
return excelToList(file, 0, null);
}
/**
* 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
* @param file 엑셀 파일(xls, xlsx)
* @param x 왼쪽 위 모서리 x
* @param y 왼쪽 위 모서리 y
* @param width 오른쪽 아래 모서리 x
* @param height 오른쪽 아래 모서리 y
* @return
* @throws Exception
*/
public static Object[][] excelToList(File file, int x, int y, int width, int height) throws Exception {
Integer [] colRow = {x, y, width, height};
return excelToList(file, 0, colRow);
}
/**
* 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
* @param file 엑셀 파일(xls, xlsx)
* @param colRow 범위 지정 new Integer[]{왼쪽 위 모서리 x, 왼쪽 위 모서리 y, 오른쪽 아래 모서리 x, 오른쪽 아래 모서리 y}
* @return
* @throws Exception
*/
public static Object[][] excelToList(File file, Integer [] colRow) throws Exception {
return excelToList(file, 0, colRow);
}
/**
* 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
* @param file 엑셀 파일(xls, xlsx)
* @param sheetIndex 시트 번호
* @return
* @throws Exception
*/
public static Object[][] excelToList(File file, int sheetIndex) throws Exception {
return excelToList(file, sheetIndex, null);
}
/**
* 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
* @param file 엑셀 파일(xls, xlsx)
* @param sheetIndex 시트 번호
* @param colRow 범위 지정 new Integer[]{왼쪽 위 모서리 x, 왼쪽 위 모서리 y, 오른쪽 아래 모서리 x, 오른쪽 아래 모서리 y}
* @return
*/
public static Object[][] excelToList(File file, int sheetIndex, Integer [] colRow) throws Exception {
Object [][] contentData = null;
FileInputStream fis = null;
Workbook workBook = null;
Sheet sheet = null;
try {
if( colRow != null ){
if( colRow.length != 4 ) throw new Exception("colRow[] 무조껀 셋팅 해야 합니다. ex) new Integer[]{0,0,6,2}");
if( !(colRow[0] >= 0 && colRow[1] >= 0) ) throw new Exception("colRow[] 0 이상 입력 하시요. ex) new Integer[]{1,1,6,2}");
if( !(colRow[2] >= 0 && colRow[3] >= 0) ) throw new Exception("colRow[] 0 이상 입력 하시요. ex) new Integer[]{1,1,6,2}");
}
fis = new FileInputStream(file);
workBook = WorkbookFactory.create(fis);
sheet = workBook.getSheetAt(sheetIndex);
int minCol = colRow==null?0:colRow[0];
int maxCol = colRow==null?-1:colRow[2]+1;
int minRow = colRow==null?0:colRow[1];
int maxRow = colRow==null?sheet.getPhysicalNumberOfRows():colRow[3]+1;
FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
for( int i=minRow; i<maxRow; i++ ) {
Row row = sheet.getRow(i);
if( i-minRow == 0 ){
if( maxCol == -1 ){
maxCol = row.getPhysicalNumberOfCells();
}
contentData = new Object[maxRow-minRow][maxCol-minCol];
}
for( int j=minCol; j<maxCol; j++ ) {
Cell cell = row.getCell(j)==null?row.createCell(j):row.getCell(j);
Object value = null;
switch( cell.getCellType() ) {
case XSSFCell.CELL_TYPE_FORMULA :
if( !(cell.toString() == "") ){
if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_NUMERIC){
//value = cell.getNumericCellValue();
value = String.valueOf(new Double(cell.getNumericCellValue()).intValue());
}else if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_STRING){
value = cell.getStringCellValue();
}else if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_BOOLEAN){
value = String.valueOf(cell.getBooleanCellValue());
}
}
break;
case XSSFCell.CELL_TYPE_NUMERIC :
//value = cell.getNumericCellValue();
value = String.valueOf(new Double(cell.getNumericCellValue()).intValue());
break;
case XSSFCell.CELL_TYPE_STRING :
value = cell.getStringCellValue()==null?new String(""):cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_BOOLEAN :
value = Boolean.toString(cell.getBooleanCellValue()); //boolean
break;
default :
}
logger.debug("xlsx ["+i+"]["+j+"]=" + ((cell==null || value==null)?"":value));
contentData[i-minRow][j-minCol] = (value==null)?new String(""):value;
}
}
} catch (Exception e) {
logger.error(e);
throw new Exception("POI Excel Read 중 오류가 발생하였습니다.");
} finally {
if( fis != null ) fis.close();
}
return contentData;
}
/**
* List
--------------
dom4j-1.6.1.jar
poi-3.6-20091214.jar
poi-ooxml-3.6-20091214.jar
poi-ooxml-schemas-3.6-20091214.jar
xmlbeans-2.3.0.jar
등