Apache POI在读取CSV转换的单元格数据时发生Java空指针exception

我正在为这个应用程序做两件事:一个是在类被调用的时候,它会从上到下运行两个,我可以调用公共方法“xlxTOcsvConverter”并提供三个需要的参数供将来使用。 。如果这个类运行,将会input4个文件,并且会写入4个文件。 前三个工作很好,但最后一个,有评论的那个,似乎失败了,给出的错误。 现在我遇到的问题是,数据是由外部公司维护的,而且我们只有阅读权限,所以我只能要求他们维护一组单元格格式,但这可能不会坚持。 我注意到失败的单元格是格式化为date,但是是空的。 所有其他空单元格是通用格式; 它实际上是它的格式化的唯一单元格。 我猜这就是为什么它失败。 我是否缺less一些其他的cell_types?

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package datarefresh; import java.io.FileInputStream; import java.io.FileWriter; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; /** * * @author null */ public class DataRefresh { public static String EOL = System.getProperty("line.separator"); //Finding out OS specific EOL and setting it to a string named EOL /** * @param args the command line arguments */ public static void main(String[] args) { String StrInfoXLS = "\\\\path\\Dashboard.xls"; String POSPwXLS = "\\\\path\\POS Passwords.xls"; String NetPwXLS = "\\\\path\\Dashboard Data.xls"; String SnLPwXLS = "\\\\path\\AccessVia ID & Passcodes - Helpdesk.xls"; String StrInfoCSV = "\\\\path\\StoreInfoTst.csv"; String POSPwCSV = "\\\\path\\POS PasswordsTst.csv"; String NetPwCSV = "\\\\path\\Dashboard DataTst.csv"; String SnLPwCSV = "\\\\path\\AccessVia ID & Passcodes - HelpdeskTst.csv"; String StrInfoSht = "Store List"; String POSPwSht = "Sheet1"; String NetPwSht = "Network"; String SnLPwSht = "S & L Store List w Passcode"; xlxTOcsvConverter(StrInfoXLS,StrInfoSht,StrInfoCSV); xlxTOcsvConverter(POSPwXLS,POSPwSht,POSPwCSV); xlxTOcsvConverter(NetPwXLS,NetPwSht,NetPwCSV); xlxTOcsvConverter(SnLPwXLS,SnLPwSht,SnLPwCSV); //THIS ONE IS NOT WORKING } public static void xlxTOcsvConverter(String inFile, String inSheet, String outFile) { DataRefresh GetIt = new DataRefresh(); String data = ""; try{ FileWriter output = new FileWriter(outFile); Workbook wb = WorkbookFactory.create(new FileInputStream(inFile)); Sheet sheet = wb.getSheet(inSheet); Row row = null; for(int i = 0; i<sheet.getLastRowNum(); i++){ row = sheet.getRow(i); for(int j = 0; j<row.getLastCellNum(); j++){ Cell cell = row.getCell(j); data = GetIt.getCellValue(cell); output.write(data + ";"); } output.write(EOL); } output.close(); } catch(Exception e){ System.out.println(e); } } private String getCellValue(Cell cell){ String data = ""; if(cell == null){ return ""; } if(cell.getCellType() == Cell.CELL_TYPE_BLANK){ return ""; } if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){ switch (cell.getCachedFormulaResultType()){ case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)){ data = String.valueOf(cell.getDateCellValue()); return data; }else{ double temp = cell.getNumericCellValue(); data = String.format("%.0f", temp); return data; } case Cell.CELL_TYPE_STRING: data = cell.getStringCellValue(); return data; } } if(cell.getCellType() == Cell.CELL_TYPE_STRING){ data = cell.getStringCellValue(); return data; } if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ if(DateUtil.isCellDateFormatted(cell)){ data = String.valueOf(cell.getDateCellValue()); return data; }else{ double temp = cell.getNumericCellValue(); data = String.format("%.0f", temp); return data; } } return ""; } 

}

这是它的堆栈跟踪:

 Exception in thread "main" java.lang.NullPointerException at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:214) at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:186) at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:173) at jdk.nashorn.internal.objects.Global.checkObject(Global.java:1500) at jdk.nashorn.internal.objects.NativeError.printStackTrace(NativeError.java:187) at datarefresh.DataRefresh.xlxTOcsvConverter(DataRefresh.java:68) at datarefresh.DataRefresh.main(DataRefresh.java:45) Java Result: 1 BUILD SUCCESSFUL (total time: 5 seconds) 

我改变了:

  catch(IOException | InvalidFormatException e){ printStackTrace(e); } 

现在stacktrace返回:

 Exception in thread "main" java.lang.NullPointerException at datarefresh.DataRefresh.xlxTOcsvConverter(DataRefresh.java:60) at datarefresh.DataRefresh.main(DataRefresh.java:47) Java Result: 1 

如果行0和行之间有完全空的行sheet.getLastRowNum()那么在row = sheet.getRow(i)之后, row = sheet.getRow(i)是NULL。 这是因为完全空行没有物理存储在XLS文件中。

这个你应该考虑。 例:

 public static void xlxTOcsvConverter(String inFile, String inSheet, String outFile) { DataRefresh GetIt = new DataRefresh(); String data = ""; try { FileWriter output = new FileWriter(outFile); Workbook wb = WorkbookFactory.create(new FileInputStream(inFile)); Sheet sheet = wb.getSheet(inSheet); Row row = null; for(int i = 0; i<=sheet.getLastRowNum(); i++) { row = sheet.getRow(i); if (row == null) { data = "empty row"; output.write(data); } else { for(int j = 0; j<row.getLastCellNum(); j++) { Cell cell = row.getCell(j); data = GetIt.getCellValue(cell); output.write(data + ((j<row.getLastCellNum()-1) ? ";" : "")); } } output.write(EOL); } output.close(); } catch(Exception e) { e.printStackTrace(); } }