Apache POI 如何读取Excel中数值类型单元格所规定的保留小数位?
问题描述
java apache poi 包内是否有方法可以获取Excel数值类型单元格中保留的位数?
问题出现的环境背景及自己尝试过哪些方法
有这么一个场景:
需求:从Excel文件中读取数据,原样落库
我的实现思路:
使用POI读取每个单元格内容,根据规则落库
但是在使用POI读取数值类型的单元格时出现了问题,有这么一类值,格式是保留n位小数,但是小数位为全0:
这种类型的值我在使用POI读取时,只能读到整数位,无法读取小数位。
我尝试过的获取方法为(仅节选处理数值类型单元格逻辑):
使用NumberFormat格式化:
import org.apache.poi.ss.usermodel.*;
private static NumberFormat numberFormat = NumberFormat.getNumberInstance();
public static String getStringValue(Cell cell){
String cellValue;
//是数字类型单元格
if(cell.getCellTypeEnum().equals(CellType.NUMERIC)){
//非日期类型的数字单元格
if(!DateUtil.isCellDateFormatted(cell)){
double doubleValue = cell.getNumericCellValue();
cellValue = numberFormat.format(doubleValue);
}
}
return cellValue;
}
使用DecimalFormat格式化:
import org.apache.poi.ss.usermodel.*;
private static DecimalFormat decimalFormat = new DecimalFormat("#.######");
public static String getStringValue(Cell cell){
String cellValue;
//是数字类型单元格
if(cell.getCellTypeEnum().equals(CellType.NUMERIC)){
//非日期类型的数字单元格
if(!DateUtil.isCellDateFormatted(cell)){
double doubleValue = cell.getNumericCellValue();
cellValue = decimalFormat.format(doubleValue);
}
}
return cellValue;
}
直接设置类型为String获取:
import org.apache.poi.ss.usermodel.*;
public static String getStringValue(Cell cell){
String cellValue;
//是数字类型单元格
if(cell.getCellTypeEnum().equals(CellType.NUMERIC)){
//非日期类型的数字单元格
if(!DateUtil.isCellDateFormatted(cell)){
cell.setCellType(CellType.STRING);
cellValue = cell.getStringCellValue();
}
}
return cellValue;
}
但是最终的结果都无法读取我想要的保留n位0的数
后来我又尝试了使用EasyExcel,得到的是同样的结果。
你期待的结果是什么?实际看到的错误信息又是什么?
我期待结果为:能够读取出 1000000.00、1000.0000、185.00这三个字符串。
我分析过为什么无法读取出,应该是因为单元格内存储的值就是整数,只是显示出来的时候加上了单元格保留小数的格式。
所以我认为单纯的读数应该解决不了这个问题,需要再获取一个该单元格的保留位数值才行,但是我翻了一下POI的文档,好像都没有看到类似的方法。所以求助各位大佬!
java apache poi 包内是否有方法可以获取Excel数值类型单元格中保留的位数?
或者是否有其他可以达到效果的实现方法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可以试试
HSSFCellStyle
的getDataFormatString()
方法,会有一个数据格式字符串,你用这个字符串就可以获取你想要的保留位数了说实话我是用
EasyExecl
的,对poi
不是很了解,但是也知道EasyExecl
是以poi
为基础写的,所以我最开始是去看EasyExecl
是否可以获取到小数位数结果就在官方文档这里看到了啊,用
CellData
接在
CellData
中找到了一个属性dataFormatString
我是反向找
dataFormatString
如何赋值,才看到这里用了XSSFCellStyle
才回到
poi
读取的api
里,想到单元格格式多半也是跟cell
相关,所以输入个getStyle
方法,提示自己就出来了噻虽然不能直接获取到你想要的效果,但是起码是找到了一点点和小数位数相关的数据,希望可以帮到你
decimalFormat的构造器传入0.000就行了