Чтение чисел в текстовом формате с помощью 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.