2017-01-25 24 views
0

我在我的excel阅读器中遇到问题。它不读取空白或空白单元格,并跳到具有值的下一个单元格。在java中读取Excel文件没有读取或计算空白单元格为空

例子..

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

哦..我试着把放在空单元格上,它相应地读取。但空白或空白单元格,它跳过空白单元格..我真的不知道我的代码是什么问题..找不到任何解决方案。 –

+0

那么你有没有在调试器中检查'sheetData'?或在'sheetData.add(data)'前面检查'data.size()'' – 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。 –