Я играл с этим несколько дней, но просто не могу заставить его работать. У меня есть несколько длинных чисел (16 цифр), хранящихся в моей базе данных, которые я затем использую функцию toArray () для создания моей электронной таблицы xlsx excel. Код, который я использую для форматирования столбца:
$sheet->setColumnFormat(array( 'A' => '@' ));
Однако числа показаны в Excel как числа, и они сокращаются с научным обозначением.
Что я могу сделать с этим, кроме добавления пробела с обеих сторон?
Мне известно о 15-значном ограничении Excel, однако при форматировании в виде текста я был убежден, что это не будет проблемой.
Та же проблема, но в моем случае это 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, истина);
});
Надеюсь это поможет ;)
У меня все еще та же проблема. Фактически, он изменяет формат (шрифт), но не формат данных.
Это ошибка или я делаю это неправильно?
@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.
Это странно. Все еще не работает:
У меня нужная версия? (v2.1.16)
Кто-нибудь? .. У меня все еще проблема ...
В Laravel 5.3 maatwebsite / excel 2.1.12
Мне удалось заставить его работать со следующими двумя изменениями
У меня недавно возникла эта проблема, я пытаюсь использовать метод 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;
Самый полезный комментарий
$ excel-> sheet ('персонал', функция ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (массив (
'H' => '@',
));
$ sheet-> rows ($ data, истина);
});
Надеюсь это поможет ;)