2017-01-25 5 views
0

У меня проблема с моим читателем excel в java. Он не читает пустые или пустые ячейки и не переходит к следующей ячейке, которая имеет значение.Чтение файла Excel в java не читает или не подсчитывает пустую ячейку как нуль

пример ..

header1 | header2 | header3 | header4 
row1 |   | row3 | row4 
row1 | row2 |   | row4 
     | row2 | row3 | 

результаты:

header1 | header2 | header3 | header4 
row1 | row3 | row4 | 
row1 | row2 | row4 | 
row2 | row3 |   | 

ожидается, произойдет:

header1 | header2 | header3 | header4 
row1 | null | row3 | row4 
row1 | row2 | null | row4 
null | row2 | row3 | null 

нуль или "" (пустая строка)

Вот мой код:

мой readXLSFile метод:

private boolean readXLSFile(String batchRunNbr, String filename) throws IOException, ParseException { 

     List sheetData = new ArrayList(); 
     FileInputStream fis = null; 
     try { 
      if ((filename.endsWith(".xlsx")) || (filename.endsWith(".XLSX"))) { 
       log.info("Reading xlsx file..."); 
       fis = new FileInputStream(filename); 
      } else{ 
       this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+ 
         "Unable to process the file. Please save the file to the latest Excel *.xlsm or *.xlsx file."; 
       return true; 
      } 


      XSSFWorkbook workbook = new XSSFWorkbook(fis); 
      XSSFSheet sheet = workbook.getSheetAt(0); 

      Iterator<Row> rows = sheet.rowIterator(); 
      int counter = 0; 
      while (rows.hasNext()) { 
       counter++; 
       XSSFRow row = ((XSSFRow) rows.next()); 
       Iterator<Cell> cells = row.cellIterator(); 

       List data = new ArrayList(); 
       while (cells.hasNext()) { 
        Cell cell = (XSSFCell) cells.next(); 

        data.add(cell); 
       } 
       sheetData.add(data); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+ 
        e.getMessage()+this.htmlNextLine+e.getCause(); 
      return true; //There is an error, return true. 
     } finally { 
      if (fis != null) { 
       fis.close(); 
      } 
     } 

     processExcelSheet(sheetData, batchRunNbr, filename); 

Вот мой processExcelSheeet метод:

private void processExcelSheet(List sheetData, String batchRunNbr, String inputFileName) { 
     DateFormat formatter; 
     formatter = new SimpleDateFormat("dd.MM.yyyy"); 
     boolean firstTime = true; 
     try { 
      for (int i = 0; i < sheetData.size(); i++) { 
       List list = (List) sheetData.get(i); 
       if (firstTime) { 
        firstTime = false; 
       } else { 
        for (int ii = 0; ii < list.size(); ii++) { 

         XSSFCell cell = (XSSFCell) list.get(ii); 
         switchCase(formatter, ii, cell); 
        } 

        insertToStaging(batchRunNbr, inputFileName);//This method inserts the data to the database based on what it reads above. 
       } 
       //log.info("COMPLETED!"); 
      } 

     } catch (Exception e) { 
      log.info("loadStagingTable Error:" + e); 
      //this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+ 
      //  "Error Loading to KLTL Data Staging. "+e.getMessage()+","+e.getCause(); 
      e.printStackTrace(); 
     } 
    } 

Я подозреваю, что проблема на row.hasNext? Пожалуйста, помогите .. Большое вам спасибо. И если вам нужна дополнительная информация, прокомментируйте это ниже.

+0

Вы проверили 'sheetData'? Исходя из вашего результата, он не должен относиться к 'rows.hasNext' или' cells.hasNext', если он возвращает false, у вас не будет строки 4 в результирующем наборе – Prisoner

+0

Oh .. Я попытался положить на пустые ячейки и он читает соответственно. Но с пустыми или пустыми ячейками он пропускает пустые ячейки. Я действительно не знаю, в чем проблема с моим кодом. Не могу найти никаких решений. –

+0

Итак, вы проверяете 'sheetData' в отладчике? или проверить 'data.size()' before 'sheetData.add (data)' – Prisoner

ответ

0

Это довольно классный код!

Просто дикое предположение: я уверен, что когда вы получите «sheet.rowIterator()», вы потеряете свои нули. Это будет иметь смысл. B/c «Итераторы» часто игнорируют пустые значения.

Итак ... если это так ... как вы это исправите?

Возможно, это будет работать:

после того, как вы определяете "лист" попытаться сделать что-то вроде

for(int i = 0; i<sheet.getLastRowNum(); i++){ 
    XSSFRow row = ((XSSFRow) sheet.getRow(i)); 
    for(int j = 0; j<row.getLastCellNum(); j++){ 
    String val = row.getCell(j).getStringCellValue(); 
    System.out.println(val.isEmpty()?"null":val);//todo: rewrite as readable "if" statement 
    } 
} 

;) счастливый кодирования!

+0

Извините, но этот код не работает. Он возвращает NullPointer. –

 Смежные вопросы

  • Нет связанных вопросов^_^