Java後端避坑——number型別轉換成Integer型別
Jakarta POI 是一套用於訪問微軟格式文件的Java API。Jakarta POI有很多元件組成,其中有用於操作Excel格式檔案的HSSF。使用POI進行Excel表格匯入的時候,經常會碰到格式轉換的問題。今天在專案中匯入Excel表出現瞭如下錯誤:
2019-04-24 22:06:06.799 ERROR 7248 --- [io-8082-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell] with root cause java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
一開始將Excel表中的編號設定為String型別,在前端匯入Excel表格之後就報上面的錯誤,於是就把編號更改為Number型別,但是碰到型別轉換的的問題,編譯器給出瞭如下的提示:

上網搜了一下,百度知道有小夥伴提供瞭如下的思路:
cell.getNumericCellValue() 返回的是double
Integer.parseInt只能轉string
可以強制規定該單元格的格式為String
cell.setCellType(1);//設定為String
String str_temp = cell.getStringCellValue().trim();//得到值
Inetger a = Integer.parseInt(str_temp);//轉換
因此按照此思路進行修改,解決了報錯的問題,更改後的程式碼如下
正確示例程式如下:
public static List<JObLevel> parseFile2list(MultipartFile file) throws IOException{ List<JObLevel> jObLevels = new ArrayList<>(); //建立文件物件 HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream()); //建立excel的表單 HSSFSheet sheet = workbook.getSheetAt(0); int physicalNumberofRows = sheet.getPhysicalNumberOfRows(); for (int i = 1;i < physicalNumberofRows;i++){ HSSFRow row = sheet.getRow(i); HSSFCell c0 = row.getCell(0); double numericCellValue = c0.getNumericCellValue();//返回double JObLevel jl = new JObLevel(); c0.setCellType(CellType.STRING);//設定為String String str_temp = c0.getStringCellValue();//得到值 Integer int_temp = Integer.parseInt(str_temp);//轉換 jl.setId(int_temp); } return jObLevels; } 複製程式碼
雖然解決了報錯,但總感覺這個不是最佳的解決方法,因為要先獲取String型別的值然後再進行轉換,顯得特別麻煩。於是向身邊的同事請教之後,採用強制型別轉換的方法,直接轉成int型別。
示例程式如下:
public static List<JObLevel> parseFile2list(MultipartFile file) throws IOException{ List<JObLevel> jObLevels = new ArrayList<>(); //建立文件物件 HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream()); //建立excel的表單 HSSFSheet sheet = workbook.getSheetAt(0); int physicalNumberofRows = sheet.getPhysicalNumberOfRows(); for (int i = 1;i < physicalNumberofRows;i++){ HSSFRow row = sheet.getRow(i); HSSFCell c0 = row.getCell(0); double numericCellValue = c0.getNumericCellValue();//返回double JObLevel jl = new JObLevel(); jl.setId((int)numericCellValue); } return jObLevels; } 複製程式碼
相比而言,下面的這種強制型別轉換要簡介很多,一行程式碼搞定!
積少成多,滴水穿石!