2012-05-01 5 views
3

Я новичок в POI Apache, но то, что я хочу сделать, читается через файл Excel (.xls) и помещает его в ArrayList для хранения, чтобы я мог впоследствии манипулировать. Я могу получить весь лист, но моя проблема в том, что: я получаю весь лист dang (~ 54183 строки).Пропуск пустых ячеек Excel в Apache POI

Я хочу пропустить ячейки, которые пусты, которые имеют тип 3. По какой-то причине, когда я system.out.print ArrayList, у него есть все пустые ячейки.

Есть ли способ пропустить эти и не добавлять их в ArrayList, который я пытаюсь создать?

У меня есть следующий фрагмент кода:

public ArrayList readExcelFile(String filePath) throws IOException { 
    ArrayList cellVectorHolder = new ArrayList(); 
    try { 
     FileInputStream inputFile = new FileInputStream(filePath); 
     POIFSFileSystem myFileSystem = new POIFSFileSystem(inputFile); 
     HSSFWorkbook wkbk = new HSSFWorkbook(myFileSystem); 
     wb = wkbk; 
     for (int i = 0; i < wb.getNumberOfSheets(); i++) { 
      HSSFSheet wkSheet = wkbk.getSheetAt(i); 
      for (Row row : wkSheet) { 
       ArrayList cellVector = new ArrayList(); 
       for (Cell cell : row) { 
        if(cell.getCellType() != 3){ 
         cellVector.add(cell); 
        } 
       } 
       cellVectorHolder.add(cellVector); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return cellVectorHolder; 
} 

Не возражаете имена ArrayList ... Я использую векторов, пока я, наконец, обнаружил, что они были амортизируется, так как 1.2 или что-то в этом роде.

ответ

3

Перед добавлением ячейки в список вы можете проверить значение ячейки. Что-то вроде:

if (cell.getStringCellValue() != null && cell.getStringCellValue().length() != 0) { 
    cellVector.add(cell); 
} 

Вы только добавляете ячейку, если есть какой-либо контент.

+0

Да, это то, что я, наконец, прибегли к. Несколько, если есть другие утверждения, чтобы проверить это. Я просто надеялся на какой-то короткий чистый способ, который у POI. Спасибо, хотя за толкание в правильном направлении! – JHizzal

+0

cell.getStringCellValue() будет вызывать исключение IllegalStateException, если тип ячейки другой, а затем текст (например, числовой). –

1

Я думаю, вам нужно перебирать строки и ячейки, таким образом POI даже не даст вам пустые ячейки.

Оформить заказ HSSFSheet.iterator(), который выполняет итерацию по всем строкам в листе. И затем Row.cellIterator(), который выполняет итерацию по ячейкам в этой строке.

И вы базово сделаны.

Если вы намерены держать ваши старые результате переменные ваши две внутренние петли становится:

for (Iterator<Row> rit = wkSheet.iterator();rit.hasNext();) { 
    ArrayList cellVector = new ArrayList(); 
    for(Iterator<Cell> cit = rit.next().cellIterator(); cit.hasNext();) { 
      cellVector.add(cit.next()); 
    } 
    cellVectorHolder.add(cellVector); 
} 
+0

Возможно, вы также захотите проверить тип с помощью CELL_TYPE_BLANK. Excel часто оставляет ячейки в файле, который был использован один раз и теперь пуст с этим типом. – Gagravarr

+0

По какой-то причине, когда я использую итератор, пустые ячейки все еще добавляются ... – JHizzal

+0

Хм, даже если вы проверяете CELL_TYPE_BLANK? Я никогда не испытывал ничего подобного. Когда я прочитал ваш код, я подумал, что вы ушли с пути, чтобы включить пустые ячейки. – esej

0

Попробуйте

List cellDataList = new ArrayList 
HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem); 
          HSSFSheet hssfSheet = workBook.getSheetAt(0); 
          Iterator rowIterator = hssfSheet.rowIterator(); 

          int lineNumber = 0; 
          while (rowIterator.hasNext()) 
          { 
           HSSFRow hssfRow = (HSSFRow) rowIterator.next(); 

           lineNumber++; 
           if(lineNumber==1){continue;} 



           Iterator iterator = hssfRow.cellIterator(); 
           List cellTempList = new ArrayList(); 
           int current = 0, next = 1; 
           while (iterator.hasNext()) 
           { 
            HSSFCell hssfCell = (HSSFCell) iterator.next(); 

            current = hssfCell.getColumnIndex(); 


            if(current<next){         


            } 
            else{ 

             int loop = current-next; 

             for(int k=0;k<loop+1;k++){ 


              cellTempList.add(null); 
              next = next + 1; 
             } 
            } 

            cellTempList.add(hssfCell); 



            next = next + 1; 



           } 
           cellDataList.add(cellTempList); 
          } 
Смежные вопросы