使用PHPExcel从Excel中读取数字时出现问题

时间:2011-04-22 08:03:00

标签: php phpexcel

我正在尝试使用PHPExcel从excelsheet中读取一个数字。

我有的代码读取数据:

$objReader = PHPExcel_IOFactory::createReaderForFile($upload_file);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($upload_file);
$objWorksheet = $objPHPExcel->getActiveSheet();
$data = array();

$i = 0;

foreach ($objWorksheet->getRowIterator() as $row) {
    if ($i < 1) {
    $i++; 
    continue; //Skip heading titles
}
$cellIterator = $row->getCellIterator();        
$cellIterator->setIterateOnlyExistingCells(false);      
foreach ($cellIterator as $cell) {          
    $data [$i] [] = $cell->getValue();          
}       
$i ++;

代码有效。我读了Excel,所有数据都很好地保存在$ data数组中。 问题出在A列我得到了一个数字(4078500264822)。它返回“4078500264820”(见最后0)。不管我怎么看。如果我打印整行,我看到值是错误的。当我使用诸如“getCalculatedValue”之类的函数时,结果是一样的。

我认为这与excel中保存字段的方式有关。我把它保存为“数字”类型。 在另一排。我保存了相同的号码。这一次作为“文本”(excel抛出关于此的通知)。 PHPExcel可以读取该数字。我有40张记录表。其中26个单元格的最后一个数字被替换为0.您可以在这里找到截断的文件(仅2行) - &gt; http://dl.dropbox.com/u/1458083/excel.xlsx

4 个答案:

答案 0 :(得分:10)

或者只是尝试ini_set(“precision”,“15”);默认值为12.为我工作。

答案 1 :(得分:2)

你在哪个平台上?

在我的Mac上,使用MacPorts的(64位)PHP解释器和PHPExcel 1.7.6,我似乎得到了正确的值:

array (
  1 => 
  array (
    0 => 4078500264822,
    1 => '02648-32.000.00',
    2 => 'Wand-slangenbox automatic',
    3 => '20m slang, rolt zichzelf gelijkmatig op na gebruik. Geïntegreerde draaggreep voor 
comfortabel transport, inclusief montagemateriaal en wand-/vloerhouder.',
    4 => 17400,
    5 => 119.95,
    6 => '',
    7 => 12,
  ),
  2 => 
  array (
    0 => '4078500888707',
    1 => '08887-20.000.00',
    2 => 'Accu gras-buxusschaar set',
    3 => 'Eenvoudig gras en buxus in vorm knippen zonder storende kabels. De messen kunnen worden verwisseld zonder gereedschap, het is bijzonder gemakkelijk, snel en veilig. Laat tevens op tijd zien wanneer de accu weer moet worden opgeladen. ',
    4 => 16340,
    5 => 69.95,
    6 => 79.95,
    7 => 12,
  ),
)

运行时的输出是什么:

$ php -r 'echo PHP_INT_MAX;'

如果它是2147483647,那么尝试64位解释器。或使用PHPExcel提交请求以修复转换。

答案 2 :(得分:2)

如果该值在Excel中存储为字符串,则在将其加载到PHPExcel中时将以字符串形式存储(假设您使用的是默认值绑定器... Advanced Value Binder肯定会导致您问题的目的是处理转换为更合适的数据类型)。如果它在Excel中存储为数字,那么即使在加载到PHPExcel之前精度也会丢失。

你能做什么,是设置你自己的Value Binder(扩展默认值Binder),使用bindValue()方法测试正被读取的单元格的列引用(以查看它是否为A列),以及力PHPExcel将该值存储为字符串(即使已从Excel文件中读取数字)。

修改

此绑定器应该按照我的建议执行,强制PHPExcel将A列中的所有值加载为字符串。

class SpecialValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
{
    public function bindValue(PHPExcel_Cell $cell, $value = null)
    {
        if ($cell->getColumn() == 'A') {
            $value = PHPExcel_Shared_String::SanitizeUTF8($value);
            $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
            return true;
        }

        // Not bound yet? Use parent...
        return parent::bindValue($cell, $value);
    }
}


/**  Tell PHPExcel that we want to use our Special Value Binder  **/
PHPExcel_Cell::setValueBinder( new SpecialValueBinder() );

确保定义绑定器,并告诉PHPExcel在执行load()

之前使用它

编辑2

正如crishoj所做的那样,我已经运行了你的代码(在Windows上使用32位PHP)。 var_dump()返回值4078500264822作为浮点数,这是我所期望的(该值太大而不能存储为32位整数),并且回显它会显示相同的正确值而不会损失准确性

答案 3 :(得分:-3)

感谢mark和crishoj的支持。不幸的是,它没有解决问题;( 我无法在这里向任何人提供正确的解决方案,因为即使在调用Excel加载函数之前,我的数据仍然存在损坏。

我通过强迫我的客户使用CSV解决了这个问题。这是代码中的一个非常小的变化(又名.1行,PHPExcel ==真棒!)现在我收到一切作为字符串(因此,它的工作原理!)

再次感谢您的帮助。