Проблема чтения чисел из Excel с PHPExcel - PullRequest
3 голосов
/ 22 апреля 2011

Я пытаюсь прочитать число из таблицы исключений, используя PHPExcel.

У меня есть код, который читает данные:

$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 ]

10 голосов
/ 18 мая 2012

Или, может быть, просто попробуйте ini_set («точность», «15»);как значение по умолчанию 12. Работало для меня.

2 голосов
/ 22 апреля 2011

Если значение хранится в виде строки в Excel, то оно будет сохраняться в виде строки при загрузке в PHPExcel (при условии, что вы используете связыватель значений по умолчанию ... Расширенный связыватель значений наверняка вызовет у вас проблемы, поскольку его целью является обработка преобразования в более подходящий тип данных). Если он хранится в виде числа в Excel, точность теряется даже до его загрузки в PHPExcel.

Что вы могли бы сделать, это установить свой собственный связыватель значений (расширяя связыватель значений по умолчанию) с помощью метода bindValue (), который проверяет ссылку на столбец читаемой ячейки (чтобы узнать, является ли это столбец А), и вынуждает PHPExcel для сохранения этого значения в виде строки (даже если числовое значение было прочитано из файла Excel).

EDIT

Этот компоновщик должен делать то, что я предложил, заставляя 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, я запустил ваш код (используя 32-битный PHP на Windows). Var_dump () возвращает значение 4078500264822 в виде числа с плавающей запятой, чего я и ожидал (значение слишком велико, чтобы его можно было сохранить как 32-разрядное целое число), и при его отображении отображается то же правильное значение без потери точности .

2 голосов
/ 22 апреля 2011

На какой платформе вы работаете?

На моем Mac, используя (64-битный) интерпретатор PHP от MacPorts с 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, чтобы исправить кастинг.

0 голосов
/ 27 апреля 2011

Спасибо, Марк и crishoj за вашу поддержку. К сожалению, это не решило проблему; ( Я не могу дать никому здесь правильное решение, так как мои данные были повреждены еще до вызова функции загрузки Excel.

Я решил проблему, заставив моего клиента использовать CSV. это было очень незначительное изменение в коде (ака. 1 строка, PHPExcel == здорово!), и теперь я получаю все как строку (и, таким образом, это работает!)

Опять же, спасибо за помощь.

...