【问题标题】:phpexcel reading an excel file decimal numbers are read incorrectlyphpexcel读取excel文件十进制数被错误读取
【发布时间】:2014-02-21 12:58:01
【问题描述】:

我在 .xlsx 文件的单元格中有值“9,2”(荷兰记法“9.2”),该单元格具有“通用”数字格式。此外,您还可以查看公式的上栏中的值显示“9,2”当我使用 PHPExcel 和 ->getValue() 读取此单元格时,我得到“9,199999999999999”。

这是我的代码:

$oPhpReader = PHPExcel_IOFactory::createReader($sFileType);
$aWorksheetNames = $oPhpReader->listWorksheetNames($sFileName);
$oPhpReader->setReadDataOnly(true);
$oPhpReader->setLoadSheetsOnly($aWorksheetNames[0]);
$oPhpExcel = $oPhpReader->load($sFileName);
$oWorksheet = $oPhpExcel->getActiveSheet();
$oCell = $oWorksheet->getCellByColumnAndRow($iCol,$iRow);
$sTempValue = $oCell->getValue();

【问题讨论】:

  • 欢迎来到计算机舍入错误的世界......使用 number_format() 或 sprintf() 将其显示到小数点后 1 位,它会神奇地自我纠正
  • 好吧,如果我知道我有多少个小数位,那将是一个很好的解决方案,但是有些数字与其他数字有两个或三个数字......坦率地说,计算机没有舍入任何东西。单元格中有一个普通的数字,没有计算,只有 9,2...不可能那么难...
  • 但是单元格中没有“普通数字”,单元格中有一个“浮点”值 - 这意味着 en.wikipedia.org/wiki/Floating_point#Accuracy_problems 适用 - “不可能那么难”,但是使用标准 IEEE 处理浮点数的数字计算机的每一种编程语言都容易受到这种影响....您在 MS Excel 中看到的 舍入格式
  • 如果您尝试使用getFormattedValue()(返回反映格式掩码的数字)而不是getValue()(返回“原始”数据值),或许可以
  • 很明显,这不是 php 或 PHPExcel 的错误,但 PHPExcel 应该提供开箱即用的解决方案。

标签: decimal phpexcel


【解决方案1】:

这就是我现在解决问题的方法。虽然我不认为这是一个非常巧妙的解决方案,但它可能是唯一的方法。

我只是想我永远不会得到超过 12 位的数字,只有当 PHPExcel 出错时。所以我使用 number_format 将所有浮点数舍入到 12 位:

if ((is_numeric($sTempValue))&&(strpos($sTempValue,'.')))
{
    $sTempValue = rtrim(rtrim(number_format($sTempValue,12,',',''),'0'),',');
}

【讨论】:

  • 但请注意 - 这不是一个 PHPExcel 错误,甚至是一个 PHP 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多