Чтение чисел в текстовом формате с помощью 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,
У вас есть представление о том, как я могу решить эту проблему?
Ответы
Ответ 1
Форматирование с использованием числового формата влияет на то, как число отображается, а не как сохранено.
Вам нужно сохранить числа явно как строки, поэтому вы не можете использовать 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 использовать связующее значение value вместо связующего по умолчанию:
PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() );
Ответ 2
Я знаю, что это было опубликовано некоторое время назад, но мне хотелось поделиться чем-то, что сработало для меня, поэтому вы все равно можете использовать ->fromArray
и не должны перебирать всю электронную таблицу.
Если вы обернете свои значения в ="VALUE"
, он будет отображаться как текст, а не преобразовать его, и он не будет иметь кавычек вокруг него в вашей таблице.
Ответ 3
$objPHPExcel
->getActiveSheet()
->getCellByColumnAndRow($col, $row)
->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
Ответ 4
Вы можете форматировать значение для текста с добавлением charater до или после значения. Пример add after value charater ";"
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );
Ответ 5
Если вам нужно преобразовать все номера листов в текст, вы можете использовать calculateWorksheetDimension()
, чтобы получить размеры листа (например: "A1: B200" или "A1: C150"), а затем использовать его в getStyle()
примерно так:
// Get sheet dimension
$sheet_dimension = $spreadsheet->getActiveSheet()->calculateWorksheetDimension();
// Apply text format to numbers
$spreadsheet->getActiveSheet()->getStyle($sheet_dimension)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);
Примечание. В этом примере используется PhpSpreadsheet, поскольку это следующая версия PHPExcel.