Apache POI 如何读取Excel中数值类型单元格所规定的保留小数位?

御龙镜中潜
  • 59

问题描述

java apache poi 包内是否有方法可以获取Excel数值类型单元格中保留的位数?
image.png

问题出现的环境背景及自己尝试过哪些方法

有这么一个场景:
需求:从Excel文件中读取数据,原样落库

我的实现思路:

使用POI读取每个单元格内容,根据规则落库

但是在使用POI读取数值类型的单元格时出现了问题,有这么一类值,格式是保留n位小数,但是小数位为全0:
image.png

这种类型的值我在使用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的数
image.png

后来我又尝试了使用EasyExcel,得到的是同样的结果。

你期待的结果是什么?实际看到的错误信息又是什么?

我期待结果为:能够读取出 1000000.00、1000.0000、185.00这三个字符串。

我分析过为什么无法读取出,应该是因为单元格内存储的值就是整数,只是显示出来的时候加上了单元格保留小数的格式。
所以我认为单纯的读数应该解决不了这个问题,需要再获取一个该单元格的保留位数值才行,但是我翻了一下POI的文档,好像都没有看到类似的方法。所以求助各位大佬!
java apache poi 包内是否有方法可以获取Excel数值类型单元格中保留的位数?
或者是否有其他可以达到效果的实现方法?

回复
阅读 1.8k
2 个回答
✓ 已被采纳

可以试试HSSFCellStylegetDataFormatString()方法,会有一个数据格式字符串,你用这个字符串就可以获取你想要的保留位数了

image.png

说实话我是用EasyExecl的,对poi不是很了解,但是也知道EasyExecl是以poi为基础写的,所以我最开始是去看EasyExecl是否可以获取到小数位数

结果就在官方文档这里看到了啊,用CellData

CellData中找到了一个属性dataFormatString
image.png

我是反向找dataFormatString如何赋值,才看到这里用了XSSFCellStyle
image.png

才回到poi读取的api里,想到单元格格式多半也是跟cell相关,所以输入个getStyle方法,提示自己就出来了噻

虽然不能直接获取到你想要的效果,但是起码是找到了一点点和小数位数相关的数据,希望可以帮到你

decimalFormat的构造器传入0.000就行了🌝!他就会给你三位小数,那个#还真没debug进去看是啥

你知道吗?

宣传栏