因项目中使用了最新的excel3.1插件来导出为excel表格,所以相关的资料非常缺乏,网上大多是老版本的,无法使用。经反复测试,最为简单的方法是,将所有导出的内容设置为文本。
首先,修改默认绑定器,打开config/excel.php文件,修改 'value_binder' 这一段,修改为:
'default' => PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class,//单元格输出为字符串,防止科学计数法
然后,在导出模型中,也要use这个绑定器:
namespace App\Admin\Controllers; use Encore\Admin\Grid\Exporters\ExcelExporter; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Cell\StringValueBinder;//防止科学计数法 class PostsExporter extends ExcelExporter { protected $fileName; //导出的文件名 protected $headings; //导出所有字段 public function __construct($bm,$zwbm) { $zdsz = Schema::getColumnListing($bm);//获取所有字段 //$szdx = json_encode($zdsz,JSON_UNESCAPED_UNICODE);//转为对象 $zwbm = $zwbm.'.xls'; $this->fileName = $zwbm; //将控制器传来的导出表名赋值给fileName $this->headings = $zdsz; //将所有字段赋值给headings } }
还有一个更好的方法是:
打开默认配置文件vendor/maatwebsite/excel/src/DefaultValueBinder.php,添加
use PhpOffice\PhpSpreadsheet\Cell\DataType;
函数内部添加:
//超过10位的数字转文本格式,防止科学计数法 if (strlen($value) > 10) { $cell->setValueExplicit($value, DataType::TYPE_STRING); return true; }
文件代码最终如下:
namespace Maatwebsite\Excel; use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder as PhpSpreadsheetDefaultValueBinder; use PhpOffice\PhpSpreadsheet\Cell\DataType; class DefaultValueBinder extends PhpSpreadsheetDefaultValueBinder { /** * @param Cell $cell Cell to bind value to * @param mixed $value Value to bind in cell * * @return bool */ public function bindValue(Cell $cell, $value) { if (is_array($value)) { $value = \json_encode($value); } //超过10位的数字转文本格式,防止科学计数法 if (strlen($value) > 10) { $cell->setValueExplicit($value, DataType::TYPE_STRING); return true; } return parent::bindValue($cell, $value); } }