Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache POI读取Excel文件中的数值时出现问题_Java_Excel_Apache Poi - Fatal编程技术网

Java 使用Apache POI读取Excel文件中的数值时出现问题

Java 使用Apache POI读取Excel文件中的数值时出现问题,java,excel,apache-poi,Java,Excel,Apache Poi,我有一列数字,值为0.142,但转换为0.14200000000000002 这是我的代码,我使用cell.getNumericCellValue() 浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法用二进制(即0-1)准确表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值 在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用: 仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效” 此外,作为验证上述内容的有趣小实验,在j

我有一列数字,值为0.142,但转换为0.14200000000000002

这是我的代码,我使用cell.getNumericCellValue()


浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法用二进制(即0-1)准确表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值

在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用:

仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效”

此外,作为验证上述内容的有趣小实验,在jshell会话中执行以下操作:

% jshell
|  Welcome to JShell -- Version 11
|  For an introduction type: /help intro

jshell> 0.1*0.1
$1 ==> 0.010000000000000002

你会期望上面的答案只有0.01;然而,事实并非如此。

浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法准确地用二进制(即0-1)表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值

在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用:

仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效”

此外,作为验证上述内容的有趣小实验,在jshell会话中执行以下操作:

% jshell
|  Welcome to JShell -- Version 11
|  For an introduction type: /help intro

jshell> 0.1*0.1
$1 ==> 0.010000000000000002

你会期望上面的答案只有0.01;但是,情况并非如此。

单元格。getNumericCellValue()获取存储的精确数值单元格值。但是
Excel
总是只使用15位有效数字作为数值。因此,对于
Excel
,精确值
0.14200000000000002
(有17个有效数字)将为
0.142

如果需要以字符串形式获取所有单元格值,则不应通过
CellType
获取单元格值。相反,您应该使用
apachepoi
DataFormatter.formatCellValue
方法通过将所有单元格值格式化为与
Excel
相同的字符串来获取所有单元格值。因此,如果
Excel
显示
0.142
作为单元格值,那么
DataFormatter
也将获得
0.142
,即使精确的数值单元格值为
0.14200000000000002

例如:

import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.util.Locale;

class GetDataFromExcelUsingDataFormatter {

 public static void main(String[] args) throws Exception {

  Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

  DataFormatter dataFormatter = new DataFormatter();
  FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();

  Sheet sheet = workbook.getSheetAt(0);

  for (Row row : sheet) {
   for (Cell cell : row) {
    String cellValue = dataFormatter.formatCellValue(cell, formulaEvaluator);
    System.out.println(cellValue);
   }
  }

  workbook.close();
 }
}

Cell.getNumericCellValue()。但是
Excel
总是只使用15位有效数字作为数值。因此,对于
Excel
,精确值
0.14200000000000002
(有17个有效数字)将为
0.142

如果需要以字符串形式获取所有单元格值,则不应通过
CellType
获取单元格值。相反,您应该使用
apachepoi
DataFormatter.formatCellValue
方法通过将所有单元格值格式化为与
Excel
相同的字符串来获取所有单元格值。因此,如果
Excel
显示
0.142
作为单元格值,那么
DataFormatter
也将获得
0.142
,即使精确的数值单元格值为
0.14200000000000002

例如:

import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.util.Locale;

class GetDataFromExcelUsingDataFormatter {

 public static void main(String[] args) throws Exception {

  Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

  DataFormatter dataFormatter = new DataFormatter();
  FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();

  Sheet sheet = workbook.getSheetAt(0);

  for (Row row : sheet) {
   for (Cell cell : row) {
    String cellValue = dataFormatter.formatCellValue(cell, formulaEvaluator);
    System.out.println(cellValue);
   }
  }

  workbook.close();
 }
}

看看Apachepoi上的帖子,请编辑您的问题,使其包含代码,而不是图像链接。使用代码格式,以便问题中的所有内容都易于阅读。请查看ApachePoi上的帖子。请编辑您的问题以包含代码,而不是图像链接。使用代码格式,以便问题中的所有内容都易于阅读。