Чтение чисел в текстовом формате с помощью 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. У вас есть какие-либо идеи о том, как я могу решить эту проблему??

Author: Periback, 2012-09-17

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() );
 26
Author: Mark Baker, 2012-09-17 14:20:27

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

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

 2
Author: Arkitecht, 2016-08-12 23:14:40
$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
 1
Author: Hưng, 2017-08-31 12:48:11

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

$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );
 0
Author: user3313585, 2015-04-17 03:58:55