Чтение чисел в текстовом формате с помощью PHPExcel

У меня есть массив, который может хранить числа, такие как 01, 01A, 01B, 02, 2, и когда я получаю это значение с помощью PHPExcel, он удаляет «0» в случае 01, 02, например. Чтобы решить эту проблему, я попытался отформатировать строку, в которой эти значения будут храниться в excel, и установить ее как текст, как в следующем коде:

$objPHPExcel->setActiveSheetIndexByName('BlocksList'); $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A2'); $latestBLColumn = $objPHPExcel->getActiveSheet()->getHighestDataColumn(); $column = 'A'; $row = 1; for ($column = 'A'; $column != $latestBLColumn; $column++) { $objPHPExcel->getActiveSheet()->getStyle($column.$row)->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT ); } $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A1'); 

Итак, делая это, я получаю массив с цифрами, такими как 01, 01A, 02, 02B … и я храню его в строке A2. Я получаю самую высокую колонку, чтобы использовать это значение в условии For. В этом условии я устанавливаю для строки 1 в диапазоне А до самого высокого столбца, который должен быть сформирован как текст.

Мой шаблон сгенерирован, и все числа находятся в текстовом формате, но проблема в том, что я думаю, что когда я использую метод fromArray() , он преобразует числа массива, прежде чем я получу его правильно в excel. У вас есть представление о том, как я могу решить эту проблему?

Форматирование с использованием числового формата влияет на способ отображения номера , а не на способ его сохранения .

Вам нужно будет хранить номера явно как строки, поэтому вы не можете использовать fromArray (). Вместо этого используйте setCellValueExplicit () или setCellValueExplicitByColumnAndRow (), передав аргумент $ pDataType для PHPExcel_Cell_DataType :: TYPE_STRING.

РЕДАКТИРОВАТЬ

Обратите внимание, что вы также можете устанавливать стили для диапазона ячеек, поэтому нет необходимости добавлять служебные данные цикла for:

 $range = 'A'.$row.':'.$latestBLColumn.$row; $objPHPExcel->getActiveSheet() ->getStyle($range) ->getNumberFormat() ->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT ); 

EDIT # 2 Использование связующего

Создайте настраиваемое связующее значение ячейки:

 class PHPExcel_Cell_MyValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder { public function bindValue(PHPExcel_Cell $cell, $value = null) { // sanitize UTF-8 strings if (is_string($value)) { $value = PHPExcel_Shared_String::SanitizeUTF8($value); } // Implement your own override logic if (is_string($value) && $value[0] == '0') { $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); return true; } // Not bound yet? Use default value parent... return parent::bindValue($cell, $value); } } 

Чтобы избежать проблем с автозагрузчиком, создайте его в каталоге / Classes / PHPExcel / Cell. В противном случае дайте классу собственное имя, отличное от PHPExcel, и убедитесь, что оно загружено независимо.

Затем, прежде чем использовать ваш вызов fromArray (), скажите PHPExcel использовать ваше связующее значение вместо стандартного связующего:

 PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() ); 

Я знаю, что все это было опубликовано некоторое время назад, но мне хотелось поделиться чем-то, что сработало для меня, поэтому вы все равно можете использовать ->fromArray и не должны перебирать всю электронную таблицу.

Если вы обернете свои значения в ="VALUE" он будет отображаться как текст, а не конвертировать его, и он не будет иметь кавычек вокруг него в вашей таблице

Вы можете форматировать значение для текста с добавлением charater до или после значения. Пример add after value charater ";"

 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' ); 
 $objPHPExcel ->getActiveSheet() ->getCellByColumnAndRow($col, $row) ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);