博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java后端避坑——number类型转换成Integer类型
阅读量:5930 次
发布时间:2019-06-19

本文共 2505 字,大约阅读时间需要 8 分钟。

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
parseFile2list(MultipartFile file) throws IOException{ List
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
parseFile2list(MultipartFile file) throws IOException{ List
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;}复制代码

相比而言,下面的这种强制类型转换要简介很多,一行代码搞定!

积少成多,滴水穿石!

转载于:https://juejin.im/post/5cc0736c6fb9a0322b5bfc8e

你可能感兴趣的文章
移动终端高级开发工程师
查看>>
LVM的创建和管理
查看>>
我的友情链接
查看>>
Docker镜像保存为文件及从本地文件导入镜像的方法
查看>>
告警系统主脚本、配置文件及监控项目
查看>>
快速定位线上 Node.js 内存泄漏问题
查看>>
LVS+keepalived
查看>>
2012年HTML5的14个大胆预言
查看>>
VM中CentOS7本地配置yum源方法
查看>>
Shell之Sed常用用法
查看>>
3.1
查看>>
RH253读书笔记(9)-Lab 9 Account Management Methods
查看>>
mysql之分页存储过程实例
查看>>
线性方程组迭代求解——Gauss-Seidel迭代算法(Python实现)
查看>>
Windows下面安装并运行composer的步骤
查看>>
JavaScript之tab面板切换
查看>>
C#设计模式:观察者模式(Observer Pattern)
查看>>
深入理解Java虚拟机类加载机制
查看>>
Sublime使用大全
查看>>
类和对象:数据成员之使用默认参数初始化
查看>>