File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2022-11-06
File name
Commit message
Commit date
File name
Commit message
Commit date
2022-11-06
2022-11-06
2022-11-06
2022-11-06
package common.util;
import common.vo.CommonFile;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
public class ExcelReadUtil {
/**
* @author 김재영
* @since 2021.11.15
*
* 일반 엑셀 Read xls, xlsx
* 엑셀파일 읽기 poi라이브러리 사용
*/
public static Map<String, Object> excelFileRead(CommonFile commonFile) throws Exception {
Map<String, Object> dataBySheet = new LinkedHashMap<String, Object>();
String fileFullPath= commonFile.getFileFullPath();
String sheetTitle= "sheet0";
File excelFile = new File(fileFullPath);
Workbook wb = WorkbookFactory.create(excelFile);
for (int sheetIdx = 0; sheetIdx < wb.getNumberOfSheets(); sheetIdx++) {
//한개의 시트에 대한 행,열 데이터 List
Map<String, Object> sheetData = new LinkedHashMap<String, Object>();
//rowData 담는 리스트
List<LinkedHashMap<String, Object>> rowData = new ArrayList<LinkedHashMap<String, Object>>();
List<List<String>> columnData = new ArrayList<List<String>>();
//시트 객체
Sheet sheet = wb.getSheetAt(sheetIdx);
//데이터가 들어있는 시트의 첫 번째 행 index
int firstRowNum = sheet.getFirstRowNum();
//데이터가 들어있는 시트의 최종 행 index
int lastRowNum = sheet.getLastRowNum();
//데이터가 들어있는 시트의 첫 번째 행의 마지막 열 index
//int firstCellNum = sheet.getRow(firstRowNum).getFirstCellNum();
//int lastCellNum = sheet.getRow(firstRowNum).getLastCellNum();
//Row for문
for(int rowIndex = firstRowNum+1; rowIndex <= lastRowNum; rowIndex++) {
//Row 객체
Row row = sheet.getRow(rowIndex);
if(row == null) continue;
//해당 index 행의 마지막 열 index
int lastCellNum = row.getLastCellNum();
//행에 열데이터가 1개라도 존재하는지 체크
boolean isRowDataExist = false;
//한개의 행에 대한 열 데이터
LinkedHashMap<String, Object> cells = new LinkedHashMap<String, Object>();
//Row의 Cell 데이터 담기
for(int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {
Cell cell = row.getCell(cellIndex);
try {
String value = getCellValue(cell, wb);
if (StringUtil.isEmpty(value) == true) {
cells.put("cell"+cellIndex, null);
} else {
cells.put("cell"+cellIndex, value);
isRowDataExist = true;
}
} catch (Exception e) {
cells.put("cell"+cellIndex, null);
e.printStackTrace();
}
}
//행에 열데이터가 1개라도 존재하면 -> row데이터 추가
if (isRowDataExist == true) {
//row데이터 추가
rowData.add(cells);
}
//raw데이터에 대한 명칭 입력
//dataTable.setTitle(dataTitle);
}//Row for문 끝
sheetData.put("rowData",rowData);
//시트가 2개 이상일 때, 데이터 명 == 시트명
if (wb.getNumberOfSheets() > 1) {
sheetTitle = "sheet"+sheetIdx;
}
//row데이터가 없을 때, 메세지 처리
// if (dataTable.getRowData().size() == 0) {
// dataTable.getCheckMessage().setIsSuccess(false);
// dataTable.getCheckMessage().setMessage("데이터가 없습니다");
// } else {
// dataTable.getCheckMessage().setIsSuccess(true);
// dataTable.getCheckMessage().setMessage("엑셀(.xls) 파일 읽기 완료");
// }
//Key(시트명) : Value(시트의 행,열 데이터)
dataBySheet.put(sheetTitle, sheetData);
}
//스트림 닫기
if (wb != null) {
wb.close();
}
return dataBySheet;
}
/**
* @author 김재영
* @since 2021.11.15
*
* 일반 엑셀 Read 관련
* Excel cell value 데이터 타입 파악 후, 원본형태의 문자열로 반환
*/
public static String getCellValue(Cell cell, Workbook wb) throws Exception {
if(cell != null) {
switch (cell.getCellType()) {
case FORMULA:
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
if (evaluator.evaluateFormulaCell(cell) == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
return "";
} else {
Double dou = new Double(cell.getNumericCellValue());
if ((double) dou.longValue() == dou.doubleValue()) {
return Long.toString(dou.longValue());
} else {
return StringUtil.toString(dou);
}
}
} else if (evaluator.evaluateFormulaCell(cell) == CellType.STRING) {
return cell.getStringCellValue();
} else if (evaluator.evaluateFormulaCell(cell) == CellType.BOOLEAN) {
return StringUtil.toString(new Boolean(cell.getBooleanCellValue()));
} else {
return cell.getCellFormula();
}
case NUMERIC:
BigDecimal big = new BigDecimal(cell.getNumericCellValue());
BigDecimal fp = big.subtract(new BigDecimal(big.longValue()));
if(DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
return new SimpleDateFormat("yyyy-MM-dd").format(date);
} else if(checkDateFormat(cell)) {
Date date = cell.getDateCellValue();
return new SimpleDateFormat("yyyy-MM-dd").format(date);
} else if(fp.doubleValue()==0.0d) {
return Long.toString(big.longValue());
} else {
return StringUtil.toString(new Double(cell.getNumericCellValue()));
}
case STRING:
return cell.getStringCellValue();
case BOOLEAN:
return StringUtil.toString(new Boolean(cell.getBooleanCellValue()));
case ERROR:
return StringUtil.toString(new Byte(cell.getErrorCellValue()));
case BLANK:
return "";
default:
return "";
}
} else {
return "";
}
}
/**
* @author 김재영
* @since 2021.11.15
*
* 일반 엑셀 Read 관련
* Excel cell의 포맷 형태가 데이트관련 포맷인지 체크
*/
public static boolean checkDateFormat(Cell cell) throws Exception{
try {
int formatIndex = cell.getCellStyle().getDataFormat();
switch(formatIndex) {
case 31: //excel: yyyy년 MM월 dd일
return true;
}
} catch (Exception e) {
return false;
}
return false;
}
}