Laravel使用excel3.1导出时,防止长数字变科学计数法的方法

/ 0评 / 0

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

发表评论

邮箱地址不会被公开。 必填项已用*标注