Если значение хранится в виде строки в 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-разрядное целое число), и при его отображении отображается то же правильное значение без потери точности .