3

我正在尝试使用 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 数组中。问题在于 AI 列有一个数字( 4078500264822 )。它返回为“4078500264820”(见最后一个 0)。不管我怎么读。如果我打印整行,我发现值是错误的。当我使用诸如“getCalculatedValue”之类的函数时,结果是一样的。

我认为这与该字段如何保存在 excel 中有关。我将其保存为“数字”类型。在另一排。我保存了相同的号码。这次是“文本”(excel 会对此发出通知)。PHPExcel 可以读取该数字。我有一个 40 记录表。其中 26 个单元格的最后一个数字替换为 0。您可以在此处找到截断的文件(仅 2 行)-> http://dl.dropbox.com/u/1458083/excel.xlsx

4

4 回答 4

10

或者也许只是尝试 ini_set("precision", "15"); 默认值为 12。为我工作。

于 2012-05-18T10:56:01.890 回答
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 提交请求以修复强制转换。

于 2011-04-22T08:21:58.457 回答
2

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

不过,您可以做的是使用 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() );

确保您定义了活页夹,并在执行 load()之前告诉 PHPExcel 使用它

编辑 2

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

于 2011-04-22T09:38:22.427 回答
-3

感谢您的支持。不幸的是,它没有解决问题;(我不能在这里给任何人正确的解决方案,因为我的数据在调用 Excel 加载函数之前就已经损坏了。

我通过强迫我的客户使用 CSV 解决了这个问题。这是代码中的一个非常小的变化(又名。1 行,PHPExcel == 真棒!)现在我将所有内容都作为字符串接收(因此,它可以工作!)

再次感谢您的所有帮助。

于 2011-04-27T10:33:16.147 回答