Laravel 5.3导入含小数数值的Excel问题求助
解决Laravel导入Excel小数数值异常的常见方案
嘿,我猜你大概率是遇到了Excel里的小数导入到数据库后数值异常的问题(比如被截断、精度丢失,或者存储成了奇怪的格式),结合你的代码,给你几个针对性的解决思路:
1. 确保Excel读取时保留小数精度
有时候Laravel-Excel(也就是你用的Excel::load)会默认把一些小数自动取整或者转换为字符串,你可以强制指定列的读取格式,同时主动转换类型:
\Excel::load($request->excel, function($reader) { // 给需要读取小数的列设置格式,保证精度 $reader->setColumnFormat([ 'quantity' => '0.00', // 这里的小数位数根据你的业务需求调整 'price' => '0.00' ]); $reader->each(function($row) { // 主动转换为浮点型,避免类型混淆 $quantity = (float)$row->quantity; $price = (float)$row->price; $time = strtotime($row->date); $newformat = date('Y-m-d',$time); $registry=Registry::create([ 'description' => $row->description, 'quantity' => $quantity, 'price' => $price, 'date' => $newformat, ]); $registry->save(); }); }); return "Ok!";
2. 检查数据库字段类型是否匹配
如果你的quantity和price字段在数据库里是int(整数)类型,那小数肯定会被直接截断!你需要把字段改成支持小数的类型,比如decimal(推荐,精度不会丢失)或者float:
比如在你的迁移文件里应该这样定义字段:
Schema::create('registries', function (Blueprint $table) { // ... 其他字段 $table->decimal('quantity', 8, 2); // 总长度8位,其中小数位2位,可按需调整 $table->decimal('price', 10, 2); // ... 其他字段 });
3. 处理Excel里文本格式的小数
如果你的Excel单元格是用文本格式保存的小数,读取时会得到字符串,这时候可以先做数值校验再转换:
// 在读取行数据时添加校验 $quantity = is_numeric($row->quantity) ? (float)$row->quantity : 0; // 非数值时设为默认值0 $price = is_numeric($row->price) ? (float)$row->price : 0;
调试小技巧
如果还是找不到问题,可以先打印读取到的原始数据,看看Excel里的值到底被读成了什么:
$reader->each(function($row) { dd($row); // 这会输出当前行的所有数据,你可以检查quantity和price的类型和实际值 // ... 其他代码 });
内容的提问来源于stack exchange,提问作者Pablo Curumaco
相关产品推荐
相关产品推荐

