programing

Apache POI와 함께 날짜가 있는 Excel 셀을 읽는 방법

muds 2023. 4. 21. 21:32
반응형

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

반응형