Laravel-excel: Laravel 4.2 / Laravel-Excel 1.3: числа, отформатированные как текст, по-прежнему отображаются как числа

Созданный на 3 дек. 2015  ·  38Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Я играл с этим несколько дней, но просто не могу заставить его работать. У меня есть несколько длинных чисел (16 цифр), хранящихся в моей базе данных, которые я затем использую функцию toArray () для создания моей электронной таблицы xlsx excel. Код, который я использую для форматирования столбца:
$sheet->setColumnFormat(array( 'A' => '@' ));

Однако числа показаны в Excel как числа, и они сокращаются с научным обозначением.

Что я могу сделать с этим, кроме добавления пробела с обеих сторон?

Мне известно о 15-значном ограничении Excel, однако при форматировании в виде текста я был убежден, что это не будет проблемой.

Самый полезный комментарий

$ excel-> sheet ('персонал', функция ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (массив (
'H' => '@',
));
$ sheet-> rows ($ data, истина);
});

Надеюсь это поможет ;)

Все 38 Комментарий

Та же проблема, но в моем случае это 14-значные строки.

Если вы хотите избежать научного представления длинных чисел в Excel, вам необходимо установить маску формата, которая явно отображает эти значения в виде чисел ..... использование @ просто указывает MS Excel использовать его поведение по умолчанию (который должен использовать научный формат для более длинных чисел) .... Я предлагаю вам вместо этого использовать маску формата #0

Даже тогда это не работает. Вот что я пробовал: $ sheet-> setColumnFormat (['id' => '# 0']) ;. Я также подозреваю, что setColumnFormat не работает также с CSV, поскольку я пробовал несколько форматов, и это не повлияло на формат столбца.

Я не знаю, имеет ли это значение, однако я использовал $ sheet-> fromModel ($ result); и я попробовал $ sheet-> fromArray ($ result-> toArray ()), и оба они привели к этой проблеме.

Для тех, у кого есть эта проблема с CSV, я создал следующий метод:

публичная функция getStringIdAttribute ()
{
return '= "'. $ this-> id. '"';
}
и в верхней части моей модели я добавил:
защищенный $ appends = ['string_id'];

и это заставило число отображаться как текст в Excel (а также в таблицах Kingsoft).

Если вы пишете в CSV и просматриваете через Excel, CSV не сохраняет маску формата, и Excel будет отображать результат в виде числа, используя свой формат по умолчанию (научный для больших значений) ..... всегда проверяйте любой CSV, используя текстовый редактор

Я попытался экспортировать файл, используя «# 0» в качестве формата столбца, но он преобразует последнюю цифру в 0. Если @ - идентификатор для «по умолчанию», то как я могу указать ячейку как просто текст, чтобы excel ничего не трогал ?

В настоящее время мой обходной путь экспортируется из laravel-excel как csv, а затем я использую сценарий python, который я написал для экспорта как xlsx, поскольку openpyxl, похоже, может правильно форматировать как текст.

Есть ли какое-нибудь исправление для этого поведения? Я экспортирую в XSLX из массива, где у меня есть строки типа «10E00», которые экспортируются как число «10» в Excel. setColumnFormat "@" у меня не работает ...

@lachyn Я так и не нашел хорошего исправления, как я уже сказал выше, обходной путь, который я в итоге использовал, заключался в том, чтобы экспортировать как из laravel CSV, а затем запустить команду оболочки для преобразования вывода в xlsx с помощью скрипта python.

@lszanto, но это странно, даже если я экспортирую его в "CSV", у меня есть значение "10" вместо "10E00", и я уверен, что в моем массиве есть строка "10E00" ....

@lachyn Чем вы открываете CSV? Если это просто текстовый редактор, то, возможно, laravel касается чего-то еще, поскольку CSV должен быть просто необработанным выводом, без модификаторов или чего-то еще.

Если вы хотите, и данные не являются конфиденциальными, вы можете опубликовать образец, и я попробую, когда у меня будет возможность.

@lszanto возвышенный текстовый редактор ...
Я делаю запрос с toArray () в конце. Если я сбрасываю этот массив, он будет с "10E00", после экспорта ... "10". Экспорт выполняется из этого массива, поэтому все мутаторы выполняются в запросе .... Таким образом, это должно быть изменено во время экспорта.

@lszanto наверное я нашел причину этой проблемы. Если я удалю строку заголовка из моего экспорта

  $sheet->prependRow(..)

теперь он работает, как и ожидалось .... так что, вероятно, эта функция каким-то образом нарушает форматирование. Пытался сгенерировать лист из модели или из массива, результаты те же.

Excel::create('sklad_vyrobku-'.date('d-m-Y', time()), function($excel) use ($table) {
            $excel->sheet('Sklad vyrobku k '.date('d-m-Y', time()), function($sheet) use ($table) {                                         
                 $sheet->fromModel($table, null, 'A1', false, false);
                     $sheet->prependRow(array('id','kod','...'));
                 $sheet->setColumnFormat(array('B'=>'@','C'=>'@','D'=>'@','E'=>'@'));
            });
         })->download('xlsx');

У меня была такая же проблема (Laravel 4.2), но она была решена путем вызова setColumnFormat сразу после открытия закрытия функции $ excel-> sheet.
Так что я не думаю, что это ошибка, просто логический подход.

Пример:

$excel->sheet("FooBar", function($sheet) use ($x, $y, $z) {

    $sheet->setColumnFormat(array(
       "G:H" => "@",
       "Z" => "@",
       'AH:AI' => '0',
       "AO:BB" => "h:mm",
       "BE:BR" => "h:mm",
    ));

    ...

});

У меня все еще была эта проблема, и ни одно из вышеперечисленных решений не помогло мне. Я импортировал свои данные из массива, и хотя все значения в нем были strings , я думал, что setColumnFormat все равно выполнит свою работу и преобразует ячейки в Number Format , Однако это было не так.
Я решил это путем преобразования типов всех значений в моем массиве в числа с плавающей запятой / целых чисел перед использованием метода fromArray для импорта данных в лист.

Поэтому, если у вас ничего не работает, убедитесь, что импортируемые данные имеют правильный тип, прежде чем вставлять их в лист. Надеюсь, это кому-то поможет :)

Я нашел обходной путь, используя setCellValueExplicit ()
например:

$sheet->setColumnFormat(array( //se formatea la columna a texto
    'C' => \PHPExcel_Style_NumberFormat::FORMAT_TEXT,
    'I' => 'dd-mm-yyyy hh:mm'
));

$sheet->setCellValueExplicit('C10', $object->card_number, \PHPExcel_Cell_DataType::TYPE_STRING);

Надеюсь это поможет ;)

$ excel-> sheet ('персонал', функция ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (массив (
'H' => '@',
));
$ sheet-> rows ($ data, истина);
});

Надеюсь это поможет ;)

У меня все еще та же проблема. Фактически, он изменяет формат (шрифт), но не формат данных.
captura de pantalla 2017-04-04 a las 11 11 39 a m
captura de pantalla 2017-04-04 a las 11 05 19 a m
captura de pantalla 2017-04-04 a las 11 12 58 a m

Это ошибка или я делаю это неправильно?

@minkadev
$sheet->rows($data, true) добавляет все правила "явные". Это означает, что он будет добавлен как строка, и форматирование столбца будет проигнорировано.

Спасибо @patrickbrouwers.
Я также пробую:

$sheet->fromArray($data, null, 'A1', false, false);

Думаю, я нашел, почему это не работает, не знаю, почему это вообще было добавлено: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 Это также добавляет числовые и целые числа как "строковые" значения.

Значит, это не сработает? :(

Только не устанавливайте явное значение $sheet->rows($data, true); в значение true.

Использовать:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); у меня тоже отлично работает.

Все еще не работает. Кроме того, как я могу форматировать столбцы, используя:
$sheet->fromArray($data, null, 'A1', false, false);

Ваш пример кода с $sheet->rows($data); отлично подходит для меня. Форматирование столбца правильное, когда я открываю его в Excel.

Это странно. Все еще не работает:
captura de pantalla 2017-04-05 a las 11 15 20 a m
captura de pantalla 2017-04-05 a las 11 13 48 a m
У меня нужная версия? (v2.1.16)

Кто-нибудь? .. У меня все еще проблема ...

В Laravel 5.3 maatwebsite / excel 2.1.12

Мне удалось заставить его работать со следующими двумя изменениями

  1. Предложение @LastxTemplar о приведении числа в число с плавающей запятой или int
  2. размещение setColumnFormat () сразу после открытия функции $ excel-> sheet, закрытие, согласно @ nikola-absolute

У меня недавно возникла эта проблема, я пытаюсь использовать метод setColumnFormat но у меня это не работает.
Это мой обходной путь:

foreach (...) {
    $sheet->row($row, [
        /* Your Data */
    ]);
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value, \PHPExcel_Cell_DataType::TYPE_STRING);
}

Тип заметки $column и $row - integer , ссылка здесь .

В Laravel 5.1 maatwebsite / excel 2.1.0
Мне удалось заставить его работать только путем преобразования числа в float или int
:(
Поэтому для этого мне нужно перебирать каждую строку в цикле.

Также возникла эта проблема. Будут какие-нибудь обновления?

Изменить: просто исправлено также с обходным путем @ neighbour999

Все образцы здесь говорят об экспорте в Excel,как насчет импорта из образцов Excel

значение-> imei_1 = 356803081142590;

но я получаю imei_1 как "3.5680308104231E + 14"

<?php

$path = $request->file('excel')->getRealPath();
$data = Excel::load($path, function ($reader) {
})->get(['brand', 'model', 'batch', 'imei_1', 'imei_2']);

if (!empty($data) && $total = $data->count()) {
    foreach ($data as $key => $value) {
              $insert[] = ['brand' => $value->brand,
                           'model' => $value->model,
                           'batch' => $request->batch ? $request->batch : $value->batch,
                           'imei_1' => strval($value->imei_1),
                           'imei_2' => strval($value->imei_2),
                           'created_at' => Carbon::now(),
                           'updated_at' => Carbon::now()
                         ];
        }
    /*if (!empty($insert)) {
        Device::insert($insert);
        // dd('Insert Record successfully.');
    }*/
}

@ Ra1da35ma У меня такая же проблема. Вы чего-нибудь добились с этим?

Я попытался установить привязку пользовательских значений, но это не работает, потому что значения, привязанные к ячейкам, уже находятся в научной нотации. Я могу открыть другую проблему, чтобы попытаться решить ее, поскольку это не совсем та же проблема, но, надеюсь, у вас есть дополнительная информация.

Я нашел исправление. Проблема была связана с PHP и его прецизионной переменной .ini, которая читается классом PHPExcel_Calculation. Вы не можете переопределить это ни в пакете Laravel-Excel , ни в его родительском пакете PHPExcel. Вместо этого, чтобы исправить это, я просто добавил ini_set('precision', 20) перед вызовом функции загрузки Excel.

Это моя функция:

public function getXlsxFile($filePath)
    {
        ini_set('precision', 18);
        $collection = Excel::load($filePath);

        return $collection->get();
    }

Вот как он работает для меня с laravel 5.1

$ myFile = Excel :: create ($ filename, function ($ excel) use ($ array) {
$ excel-> setTitle ('название');
$ excel-> sheet ('лист 1', функция ($ sheet) use ($ array) {
$ sheet-> setColumnFormat (массив ('B' => '0'));
$ sheet-> setColumnFormat (массив ('C' => '0'));
$ sheet-> setColumnFormat (массив ('D' => '0'));
$ sheet-> setColumnFormat (массив ('E' => '0'));
$ sheet-> rows ($ array, ложь);
// устанавливаем имена столбцов
$ sheet-> prependRow (массив (
"Название столбца 1", "Поле 1", "Поле 2", "Поле 3", "Итого"
));
});
});

Мы закрываем все старые заявки, потому что версия 2. * подходит к концу. Все наше внимание теперь уделяется версии 3.0. По-прежнему можно использовать 2. *, но активной поддержки больше не будет.

У меня сработало преобразование значения в целое число.

Это лучший ответ, введите приведение ваших переменных в массив, прежде чем передавать их методу ->fromArray : например,
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

Была ли эта страница полезной?
0 / 5 - 0 рейтинги