Laravel-excel: Laravel 4.2/Laravel-Excel 1.3:格式化为文本的数字仍然显示为数字

创建于 2015-12-03  ·  38评论  ·  资料来源: Maatwebsite/Laravel-Excel

我已经玩了几天了,但根本无法让它发挥作用。 我的数据库中存储了一些长数字(16 位),然后我使用 toArray() 函数创建我的 xlsx excel 电子表格。 我用来格式化列的代码:
$sheet->setColumnFormat(array( 'A' => '@' ));

然而,这些数字在 excel 中显示为数字,并且它们正在用科学记数法缩短。

除了在两侧附加一个空格之外,我还能做些什么吗?

我知道 excel 的 15 位限制,但是当格式化为文本时,我相信这不会成为问题。

最有用的评论

$excel->sheet('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

希望这可以帮助 ;)

所有38条评论

这里有同样的问题,但在我的情况下,它是 14 位字符串。

如果您想避免 Excel 中长数字的科学记数法,那么您需要设置一个格式掩码,将这些值显式显示为数字..... 使用@只是告诉 MS Excel 使用其默认行为(这是对更长的数字使用科学格式)......我建议你使用#0的格式掩码

即使那样它也不起作用。 这是我尝试过的:$sheet->setColumnFormat(['id'=> '#0']);。 我还怀疑 setColumnFormat 不能很好地与 CSV 一起使用,因为我尝试了多种格式并且它对列格式没有真正的影响。

我不知道这是否有区别,但是,我一直在使用 $sheet->fromModel($result); 我尝试了 $sheet->fromArray($result->toArray()) ,它们都导致了这个问题。

对于那些有 CSV 问题的人,我创建了以下方法:

公共函数 getStringIdAttribute()
{
返回 '​​="' . $this->id . '"';
}
在我的模型顶部,我添加了:
protected $appends = ['string_id'];

这迫使数字在 Excel(以及金山电子表格)中显示为文本。

如果您正在写入 CSV 并通过 Excel 查看,则 CSV 不会存储格式掩码,Excel 将使用其默认格式将结果显示为数字(对于较大值是科学的)..... 始终使用检查任何 CSV文本编辑器

我尝试使用“#0”作为列格式导出文件,但它将最后一位数字转换为 0。如果 @ 是“默认”的标识符,那么我如何将单元格列为文本,以便 excel 不涉及任何内容?

目前,我的解决方法是从 laravel-excel 导出为 csv,然后我使用我编写的 python 脚本导出为 xlsx,因为 openpyxl 似乎能够正确格式化为文本。

这种行为有什么解决办法吗? 我正在从数组导出到 XSLX,其中我有像“10E00”这样的字符串,这些字符串在 excel 中被导出为数字“10”。 setColumnFormat "@" 对我不起作用...

@lachyn我从来没有找到一个好的解决方法,就像我上面说的,我最终使用的解决方法是导出为来自 laravel 的 CSV,然后运行 ​​shell 命令使用 python 脚本将输出转换为 xlsx。

@lszanto但这很奇怪,即使我将其导出为“CSV”,我的值也是“10”而不是“10E00”,而且我确定我的数组中是字符串“10E00”....

@lachyn你用什么打开 CSV 文件? 如果它只是一个文本编辑器,那么 laravel 可能会触及其他东西,因为 CSV 应该只是原始输出,没有修饰符或任何东西。

如果您愿意并且数据不是私人的,您可以发布一个示例,我会在有机会时试一试。

@lszanto sublime 文本编辑器...
最后我正在使用 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),但在打开 $excel->sheet 函数关闭后立即调用setColumnFormat解决了。
所以我不认为这是一个错误,只是一种逻辑方法。

例子:

$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('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

希望这可以帮助 ;)

我仍然有同样的问题。 事实上,它改变了格式(字体)而不是数据格式。
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 :

所以它不会工作? :(

只是不要将显式$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建议将数字转换为浮点数或整数
  2. 根据@nikola-absolute,在打开 $excel->sheet 函数闭包后立即放置 setColumnFormat()

我最近遇到了这个问题,我尝试使用setColumnFormat方法,但对我不起作用。
这是我的解决方法:

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

注意$column$rowinteger参考这里

在 Laravel 5.1 中,maatwebsite/excel 2.1.0
我能够使它工作只将数字转换为浮点数或整数
:(
所以我必须循环每一行才能完成。

也遇到这个问题。 有更新吗?

编辑:刚刚修复也与@neighborhood999 的解决方法

这里的所有示例都在谈论导出到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 中覆盖它。 相反,为了解决这个问题,我在调用 Excel 加载函数之前添加了ini_set('precision', 20)

这是我的功能:

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('title');
$excel->sheet('sheet 1', function($sheet) use($array) {
$sheet->setColumnFormat(array('B'=>'0'));
$sheet->setColumnFormat(array('C'=>'0'));
$sheet->setColumnFormat(array('D'=>'0'));
$sheet->setColumnFormat(array('E'=>'0'));
$sheet->rows($array,false);
//设置列名
$sheet->prependRow(array(
'列名 1', 'Box 1','Box 2','Box 3','Total'
));
});
});

我们将关闭所有旧票,因为版本 2.* 即将结束生命周期。 我们现在全神贯注于 3.0 版。 仍然可以使用 2.*,但将不再有主动支持。

将值转换为整数对我有用。

这是最好的答案,在将变量传递给->fromArray方法之前,在数组中输入变量:例如
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

此页面是否有帮助?
0 / 5 - 0 等级