Apache POI와 함께 날짜가 있는 Excel 셀을 읽는 방법
Apache POI 3.6을 사용하고 있는데, 이와 같은 날짜가 있는 엑셀 파일을 읽고 싶습니다.8/23/1991
.
switch (cell.getCellType()) {
...
...
case HSSFCell.CELL_TYPE_NUMERIC:
value = "NUMERIC value=" + cell.getNumericCellValue();
break;
...
}
그러나 숫자 값 유형을 사용하여 다음과 같은 값을 반환합니다.33473.0
.
숫자 셀 타입을 사용해 보았지만, 잘 되지 않았습니다.
dbltemp=row.getCell(c, Row.CREATE_NULL_AS_BLANK).getNumericCellValue();
if (c == 6 || c == 9) {
strTemp= new String(dbltemp.toString().trim());
long tempDate = Long.parseLong(strTemp);
Date date = new Date(tempDate);
strVal = date.toString();
}
어떻게 하면 문제를 해결할 수 있을까요?
메모: HSSFDateUtil은 권장되지 않습니다.
각 행의 0이라고 하는 열 위치를 알고 있는 경우는, 다음과 같이 할 수 있습니다.row.getCell(0).getDateCellValue()
직접적으로.
http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFCell.html#getDateCellValue()
업데이트: 다음 예시는 위의 스위치 케이스 코드로 적용할 수 있습니다.숫자값과 날짜값을 확인하고 인쇄하고 있습니다.이 경우 시트의 첫 번째 열에 날짜가 있으므로 row.getCell(0)을 사용합니다.
를 사용할 수 있습니다.if (HSSFDateUtil.isCellDateFormatted ..
코드 블록을 스위치 케이스에 직접 넣습니다.
if (row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
System.out.println ("Row No.: " + row.getRowNum ()+ " " +
row.getCell(0).getNumericCellValue());
if (HSSFDateUtil.isCellDateFormatted(row.getCell(0))) {
System.out.println ("Row No.: " + row.getRowNum ()+ " " +
row.getCell(0).getDateCellValue());
}
}
출력은
Row No.: 0 39281.0
Row No.: 0 Wed Jul 18 00:00:00 IST 2007
Row No.: 1 39491.0
Row No.: 1 Wed Feb 13 00:00:00 IST 2008
Row No.: 2 39311.0
Row No.: 2 Fri Aug 17 00:00:00 IST 2007
네, 저는 당신의 문제를 이해했어요.식별이 어려운 경우 셀에 숫자 또는 데이터 값이 있습니다.
Excel에 표시된 형식의 데이터를 원하는 경우 DataFormatter 클래스를 사용하여 셀을 포맷하면 됩니다.
DataFormatter dataFormatter = new DataFormatter();
String cellStringValue = dataFormatter.formatCellValue(row.getCell(0));
System.out.println ("Is shows data as show in Excel file" + cellStringValue); // Here it automcatically format data based on that cell format.
// No need for extra efforts
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
if(cell.getCellTypeEnum() == CellType.NUMERIC||cell.getCellTypeEnum() == CellType.FORMULA)
{
String cellValue=String.valueOf(cell.getNumericCellValue());
if(HSSFDateUtil.isCellDateFormatted(cell))
{
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
Date date = cell.getDateCellValue();
cellValue = df.format(date);
}
System.out.println(cellValue);
}
날짜 셀을 판독하는 경우 이 방법은 지금까지 강력한 것으로 입증되었습니다.
private LocalDate readCellAsDate(final Row row, final int pos) {
if (pos == -1) {
return null;
}
final Cell cell = row.getCell(pos - 1);
if (cell != null) {
cell.setCellType(CellType.NUMERIC);
} else {
return null;
}
if (DateUtil.isCellDateFormatted(cell)) {
try {
return cell.getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (final NullPointerException e) {
logger.error(e.getMessage());
return null;
}
}
return null;
}
Date Utils가 필요합니다.자세한 내용은 이 문서를 참조하십시오.
아니면 POI 대신 Andy Khan의 Jexcel을 사용하는 것이 좋습니다.
Apache Poi는 DateUtil.isCellDateFormated(XSSFCell)를 사용하여 정상적으로 작동합니다.
Object objData = switch (cell.getCellType()){
case NUMERIC ->{
if(DateUtil.isCellDateFormatted(cell)){
yield cell.getDateCellValue();
}else{
yield cell.getNumericCellValue();
}
} //The rest of the cellTypes need to be implemented.
}
이제 objData를 Date 또는 Double로 테스트할 수 있습니다.
CellDateFormatter를 사용하여 Excel 셀과 동일한 형식으로 날짜를 가져올 수 있습니다.다음 코드를 참조하십시오.
CellValue cv = formulaEv.evaluate(cell);
double dv = cv.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = HSSFDateUtil.getJavaDate(dv);
String df = cell.getCellStyle().getDataFormatString();
strValue = new CellDateFormatter(df).format(date);
}
셀 번호를 알고 있다면 getDateCellValue() 메서드를 사용할 것을 권장합니다.여기서 동작한 동일한 예를 제시하겠습니다.java.util.날짜 = row.getCell().getDateCellValue(); System.out.println(날짜);
이 코드를 사용해 보세요.
XSSFWorkbook workbook = new XSSFWorkbook(new File(result));
XSSFSheet sheet = workbook.getSheetAt(0);
// Iterate through each rows one by one
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
// For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
if (cell.getNumericCellValue() != 0) {
//Get date
Date date = row.getCell(0).getDateCellValue();
//Get datetime
cell.getDateCellValue()
System.out.println(date.getTime());
}
break;
}
}
}
희망은 도움이다.
언급URL : https://stackoverflow.com/questions/3148535/how-to-read-excel-cell-having-date-with-apache-poi
'programing' 카테고리의 다른 글
빌드 실패의 원인을 오류 또는 경고 없이 찾는 방법 (0) | 2023.04.21 |
---|---|
Bash에서 두 부동소수점 숫자를 비교하려면 어떻게 해야 하나요? (0) | 2023.04.21 |
TSQL에서의 COALESCE 기능 (0) | 2023.04.21 |
SQL Server에서 전달의 첫 번째 날과 마지막 날(타임스탬프 포함)을 가져오는 방법 (0) | 2023.04.21 |
사용자 매핑 섹션이 열려 있는 파일에서는 요청된 작업을 수행할 수 없습니다. (0) | 2023.04.21 |