У меня есть массив, который может хранить числа, такие как 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);