因项目中使用了最新的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);
}
}

