问题描述
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数值类型单元格中保留的位数?
或者是否有其他可以达到效果的实现方法?
可以试试
HSSFCellStyle
的getDataFormatString()
方法,会有一个数据格式字符串,你用这个字符串就可以获取你想要的保留位数了说实话我是用
EasyExecl
的,对poi
不是很了解,但是也知道EasyExecl
是以poi
为基础写的,所以我最开始是去看EasyExecl
是否可以获取到小数位数结果就在官方文档这里看到了啊,用
CellData
接在

CellData
中找到了一个属性dataFormatString
我是反向找

dataFormatString
如何赋值,才看到这里用了XSSFCellStyle
才回到
poi
读取的api
里,想到单元格格式多半也是跟cell
相关,所以输入个getStyle
方法,提示自己就出来了噻虽然不能直接获取到你想要的效果,但是起码是找到了一点点和小数位数相关的数据,希望可以帮到你