2012-06-22 3 views
3

POI를 사용하여 Excel에서 데이터를 읽으려고합니다. 빈 셀인지 어떻게 확인할 수 있습니까?오류 : Excel에서 빈 셀을 읽는 방법

나는이 작업을해야한다고 생각없는 모르겠어요 :

java.util.Iterator<Row> rows = worksheet.rowIterator(); 

HSSFRow row = (HSSFRow) rows.next(); 
HSSFCell cellF1 = (HSSFCell) row.getCell(5); 
if(cellF1.getCellType() == HSSFCell.CELL_TYPE_BLANK) { 
    String val = ""; 
} 

내가 문 (널 포인터),하지만이를 사용하는 경우에만 나는 그것을 확인할 수있는 경우에 오류가 발생했습니다 :

를 당신이 CellIterator를 사용하는 경우
while (rows.hasNext()) { 
    HSSFRow row = (HSSFRow) rows.next(); 
    java.util.Iterator<Cell> cells = row.cellIterator(); 
    while (cells.hasNext()) { 
     HSSFCell cell = (HSSFCell) cells.next(); 
     if(cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) { 
     String emptytype = ""; 
     System.out.println("empty"); 
     } 
    } 
    } 
+0

null 포인터를 얻으면 cellF1이 정의되지 않았 음을 의미합니다. 6 번째 셀이 정의되어 있습니까? 셀은 0 기반이라는 것을 명심하십시오. – Derk

답변

8

Row.getCell의 1 인자 버전의 정상적인 동작입니다 : 당신은 모든 세포를 얻을 인덱스 인덱스

으로 그들을 가져하려는 경우, 당신은 뭔가를 할 것입니다. API 문서를 살펴보면 셀이 정의되지 않은 경우 getCell이 null을 반환한다고 명시되어 있습니다. 많은 자바 함수는 이러한 종류의 동작을 나타내므로이 점을 고려하여 코딩하는 데는 아무런 문제가 없습니다. 또한

boolean hasDataFlag = true;  
HSSFRow row = sheet.getRow(rowNumber); 
hasDataFlag = (row != null); 
HSSFCell cell = null; 
if (hasDataFlag) cell = row.getCell(cellNumber); 
hasDataFlag = (cell != null); 
if (hasDataFlag) hasDataFlag = (cell.getCellType() != Cell.CELL_TYPE_BLANK); 
if (hasDataFlag) { 
    // process the cell here 
} 

, 당신이 누락 된 세포 정책을 지정하는 두 번째 인수를 Row.getCell의 다른 버전을 사용할 수 있습니다 : 그래서, 코드의 한 버전은 같은 것이 될 수 있습니다. 이 버전을 사용하면 getCell이 빈 셀에 대해 널 셀을 반환하도록 지정할 수 있습니다. 원하는 경우, 당신은 Row.CREATE_NULL_AS_BLANK으로 정책을 지정할 수

HSSFRow row = sheet.getRow(rowNumber); 
if (row != null) { 
    HSSFCell cell = row.getCell(cellNumber, Row.RETURN_BLANK_AS_NULL); 
    if (cell != null) { 
     // process cell here 
    } 
} 

또는 : 그래서, 여기에 몇 가지 althernative 코드입니다. 이 경우 if (cell != null)if (cell.getCellType() != Cell.CELL_TYPE_BLANK)으로 바꿉니다.

+0

if (hasDataFlag) cell = row.getCell (cellNumber); hasDataFlag = (cell! = null); (hasDataFlag) hasDataFlag = (cell.getCellType()! = Cell.CELL_TYPE_BLANK); if (hasDataFlag) { 논리에서 의미가 없지만 오류를 반환하지 않으려 고 시도합니다. –

+0

안녕하십니까. 그냥 좀 더 정교하게. hasDataFlag는 셀에 데이터가있는 경우에만 true로 설정됩니다. 따라서 a) 행이 null이 아니고 b) 셀이 null이 아닌 경우 c) 셀 유형이 CELL_TYPE_BLANK가 아닌 경우에만 true입니다. 그 방법으로 코딩 한 이유는 중첩 된 ifs 전체를 피하기 때문입니다.중첩 된 ifs (내가 두 번째 exaample에서했던 것처럼)로 코드화했을 수 있지만, 개인적으로 hasDataFlag 결과를 더 깨끗한 코드로 사용한다고 느낍니다. 하지만 그건 내 개인적인 스타일 일뿐입니다. 무엇이든지 당신을 위해 더 쉽습니다. –

5

, 당신은 단지 어떤 점에서 정의 된 세포를 얻을 것이다 (NO null 세포를,하지만 당신은 blank 세포를 얻을 것이다).

Sheet sheet = workbook.getSheetAt(0); 
for (int rowNumber = sheet.getFirstRowNum(); rowNumber <= sheet.getLastRowNum(); rowNumber++) { 
    Row row = sheet.getRow(rowNumber); 
    if (row == null) { 
     // This row is completely empty 
    } else { 
     // The row has data 
     for (int cellNumber = row.getFirstCellNum(); cellNumber <= row.getLastCellNum(); cellNumber++) { 
      Cell cell = row.getCell(cellNumber); 
      if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { 
       // This cell is empty 
      } else { 
       // This cell has data in it 
      } 
     } 
    } 
} 
+0

이것은 시작 줄, 끝 줄, 시작 셀 및 끝 셀을 정의했습니다. 멋진데. 내 코드에서는 셀이 너무 커서 루프에 데이터가 있습니다. 나를 위해 아직 미스터리 poi API는 null 및 빈 셀을 어쨌든 많은 덕분에 구별 할 수 있습니다 –

0
int column, rownumber = 0; // just for showing the example code 

Row row = sheet1.getRow(rownumber); // just for showing the example code 

if (row!= null) 
    mycell = row.getCell(0); 
if (mycell != null && mycell.getCellType() != Cell.CELL_TYPE_BLANK) { 
    System.out.println(mycell.getStringCellValue()); 
} 
else{ 
    System.out.println("whatever"); 
} 
0

공공 문자열 getCellData (문자열 FILE_NAME, INT Sheet_Num, INT ROW_NUM, INT Col_Num)이 트릭은 나에게 많은 heped IOException가 {

FileInputStream fileIn = new FileInputStream(System.getProperty("user.dir")+"\\"+File_Name+".xlsx"); 
    XSSFWorkbook workbook = new XSSFWorkbook(fileIn); 
    XSSFSheet sheet=workbook.getSheetAt(Sheet_Num-1); 
    XSSFRow row = sheet.getRow(Row_Num-1); 
    XSSFCell cell= row.getCell(Col_Num-1); 
    String celldata; 
    if(cell!=null){ 
    celldata= cell.getStringCellValue(); 
    } 
    else 
     celldata =""; 
    fileIn.close(); 
    return celldata; 

    } 
0
Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK); 

가 발생합니다. 유용할까요?

관련 문제