이렇게 나오는 데이터를
이렇게 에러 메세지도 없고 값들도 엑셀과 똑같이 정상적으로 출력 시키는 과정을 설명하겠슴다
에러 메세지를 읽어보면 log4j를 필요로 하는데 이 부분은 간단하다
log4j라이브러리를 불러오기만 하면 된다
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
에러메세지는 사라졌다
log4j는 21년도쯤에 보안이슈가 있었는데
궁금하다면
https://www.boannews.com/media/view.asp?idx=105393
이 기사를 참조해보자
자 이제 값들을 제대로 출력되게끔 해보자
getCellType()
이 메소드와 switch문을 사용하면
엑셀에서 불러온 데이터별로 분기처리가 가능하다
case에 NUMRIC을 사용하면 숫자형식의 데이터를
처리하는 로직을 만들 수 있다 아래
switch (cell.getCellType()) {
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {//날짜 형식일때
Date dateValue = cell.getDateCellValue();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");//yyyy-MM-dd형식으로 바꿔줌
String formattedDate = dateFormat.format(dateValue);
System.out.print(formattedDate + "\t");
} else {
double numericValue = cell.getNumericCellValue();//숫자일때
if (numericValue == Math.floor(numericValue)) {//
int intValue = (int) numericValue;
System.out.print(intValue + "\t");
} else {
System.out.print(numericValue + "\t");
}
}
}
}
System.out.println();
getDateCellValue()//날짜
getNumericCellValue()//숫자
이렇게 숫자로 받았을때 날짜와 정수로 분기처리 할 수 있다
날짜는 쉽지만
getNumericCellValue()
로 처리한 부분은
우선 값을 double 타입으로 받는다
그리고 Math.floor를 사용해 소수점을 자르고
받은 값과 Math.floor를 비교한다
numericValue변수에 값이 1.0이고 Math.floor(numericValue)값이 1이면
if문을 충족하여 int 타입으로 변환시켜 출력시킨다
만약 값을 1.1로 받았더라면 Math.floor를 사용한 값과는 같지 않기 때문에
실수를 그대로 출력시킨다
이렇게 Apache POI라이브러리는 분기 처리가 가능하다
case STRING:
String stringValue = cell.getStringCellValue();//문자열일경우
System.out.print(stringValue + "\t");
break;
case BOOLEAN:
boolean booleanValue = cell.getBooleanCellValue();//boolean
System.out.print(booleanValue + "\t");
break;
case FORMULA:
String formulaValue = cell.getCellFormula();//수식
System.out.print(formulaValue + "\t");
break;
case BLANK:
System.out.print("\t");//공백
break;
default:
System.out.print("\t");
break;
}
}
이렇게 타입별로 분기 처리하여 출력이 가능하다
원하던 값들로 정수와 날짜형식이 제대로 출력되었다
package org.example;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExcelRead {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream(new File("read.xlsx"));
Workbook workbook = WorkbookFactory.create(file);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date dateValue = cell.getDateCellValue();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = dateFormat.format(dateValue);
System.out.print(formattedDate + "\t");
} else {
double numericValue = cell.getNumericCellValue();
if (numericValue == Math.floor(numericValue)) {
int intValue = (int) numericValue;
System.out.print(intValue + "\t");
} else {
System.out.print(numericValue + "\t");
}
}
break;
case STRING:
String stringValue = cell.getStringCellValue();//문자열일경우
System.out.print(stringValue + "\t");
break;
case BOOLEAN:
boolean booleanValue = cell.getBooleanCellValue();//boolean
System.out.print(booleanValue + "\t");
break;
case FORMULA:
String formulaValue = cell.getCellFormula();//수식
System.out.print(formulaValue + "\t");
break;
case BLANK:
System.out.print("\t");//공백
break;
default:
System.out.print("\t");
break;
}
}
System.out.println();
}
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}