Java ApachePOI:在xls正常工作时从xlsx读取错误的数字/字符串值

Java ApachePOI:在xls正常工作时从xlsx读取错误的数字/字符串值,java,excel,apache,apache-poi,Java,Excel,Apache,Apache Poi,我有两张excel表格(一张.xls,一张.xlsx),单元格A1中的内容为“1234567891234.56” 现在,我正试图使用Apache POI将这些内容导入我的java应用程序,如下所示: private String getValue(Cell myCell, int myCelltype) throws CellAccessException { try { switch (myCelltype) { case o

我有两张excel表格(一张.xls,一张.xlsx),单元格A1中的内容为“1234567891234.56”

现在,我正试图使用Apache POI将这些内容导入我的java应用程序,如下所示:

    private String getValue(Cell myCell, int myCelltype)
        throws CellAccessException {
    try {

        switch (myCelltype) {

        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:

            return myCell.getStringCellValue();

首先,无论我如何格式化单元格本身,CellType(myCell.getCellType())始终是1(String)

第二,当我从xlsx读取时,我得到了“1234567891234.5601”,而从xls读取时,我得到了“1234567891234.56”,这是我预期的结果

另一个示例是文件中的“12345678912345.6”,以及从xlsx读取结果的“12345678912345.602”

我不知道是什么导致了我的问题,似乎没有其他人有类似的问题

如果你能给我任何帮助,我将不胜感激

提前感谢德国的问候。 奥西里克

编辑: 谢谢你的评论和回答。遗憾的是,格式化返回值没有帮助,因为问题在于从excel工作表中获取正确的值。 在研究不变的细胞类型时,我做了一个奇怪的观察: 在读取xls(!)文件时,我得到了正确的字符串值(在本例中为1.23456789123456E+20)。接下来,将该字符串转换为Double

String content = myCell.getStringCellValue();
System.out.println(result + "#" +result.length());
Double dresult = Double.valueOf(result);
System.out.println(dresult);
输出如下所示:

    private String getValue(Cell myCell, int myCelltype)
        throws CellAccessException {
    try {

        switch (myCelltype) {

        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:

            return myCell.getStringCellValue();
1.23456789123456E+20#20

1.2345678912345601E20


所以我开始思考,我从xlsx中的单元格中读取这个错误,这些单元格是数字,但标记为celltype字符串,并将字符串转换为Double。双重保险有什么问题吗?也许我们这里有一些旧的Java版本,Double被破坏了。我不认为这是波伊的错,因为它是3.10决赛,应该运作良好。或者Double在转换这个字符串时做了什么,我只是不明白?我不熟悉Java,也不熟悉这项工作……只是在挣扎。

我不确定xls和xlsx中的默认十进制格式是否正在发生变化。然而,这只是一个建议,如果不固定小数点,你应该从你自己的角度固定它,就像

case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:{
    DecimalFormat df = new DecimalFormat("##.##");
    return df.format(myCell.getNumericCellValue());

如果单元格类型没有改变,则表示其他地方出了问题。包含数值的单元格应返回其类型为
cell.cell\u type\u numeric
。我将开始调查为什么会发生这种情况。另外,您应该直接使用
myCell.getCellType()
,而不是在
getValue
方法中传递类型。是否
myCellType
永远不会更改?在获取数值时,它们都返回一个
double
,因此我怀疑格式是否与他的问题有关。