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 celljava
一开始将Excel表中的编号设置为String类型,在前端导入Excel表格以后就报上面的错误,因而就把编号更改成Number类型,可是碰到类型转换的的问题,编译器给出了以下的提示:spa
cell.getNumericCellValue() 返回的是double
Integer.parseInt只能转string
能够强制规定该单元格的格式为String
cell.setCellType(1);//设置为String
String str_temp = cell.getStringCellValue().trim();//获得值
Inetger a = Integer.parseInt(str_temp);//转换3d
所以按照此思路进行修改,解决了报错的问题,更改后的代码以下excel
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类型。code
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;
}
复制代码
相比而言,下面的这种强制类型转换要简介不少,一行代码搞定!cdn
聚沙成塔,滴水穿石!对象