Чтение чисел в текстовом формате с помощью 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. Я получаю самую высокую колонку, чтобы использовать это значение в условии Для. В этом условии я устанавливаю для строки 1 в диапазоне A до самого высокого столбца, который будет сформирован как текст.
Мой шаблон сгенерирован, и все числа представлены в текстовом формате, но проблема в том, что я думаю, что когда я использую метод "fromArray()
", он преобразует числа массива, прежде чем я смогу получить его правильно в excel.
У вас есть какие-либо идеи о том, как я могу решить эту проблему??
4 answers
Форматирование с использованием числового формата влияет на способ отображения числа , а не на способ его хранения .
Вам придется хранить числа явно в виде строк, поэтому вы не можете использовать 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 );
РЕДАКТИРОВАНИЕ #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"
, они будут отображаться как текст, а не преобразовываться, и в вашей электронной таблице не будет кавычек
$objPHPExcel
->getActiveSheet()
->getCellByColumnAndRow($col, $row)
->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
Вы можете отформатировать значение в текст, добавив символ до или после значения. Пример добавления после символа значения ";"
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );