2021-05-17 laravel admin 导出 中文乱码

网上的解决方案几乎是使用改源码, 但是一旦项目进行composer update那修改的东西就没了
我参考了哈皮人的全栈技术博客写了一套通过继承的解决方案

  1. 在app/Admin/Extentsions中添加一个自定义导出类
<?php

namespace App\Admin\Extensions;

use Encore\Admin\Grid\Column;
use Encore\Admin\Grid\Exporters\CsvExporter;

class MyCsvExporter extends CsvExporter
{
    //  这个方法照搬自CsvExporter的export方法
    public function export()
    {
        if ($this->callback) {
            call_user_func($this->callback, $this);
        }

        $response = function () {

            $handle = fopen('php://output', 'w');
            $titles = [];

            //  方法中所有的内容都没改, 只有添加了下面一行的代码
            fputs($handle, chr(0xEF).chr(0xBB).chr(0xBF), 3);
            $this->chunk(function ($collection) use ($handle, &$titles) {
                Column::setOriginalGridModels($collection);

                $original = $current = $collection->toArray();

                $this->grid->getColumns()->map(function (Column $column) use (&$current) {
                    $current = $column->fill($current);
                    $this->grid->columnNames[] = $column->getName();
                });

                // Write title
                if (empty($titles)) {
                    fputcsv($handle, $titles = $this->getVisiableTitles());
                }

                // Write rows
                foreach ($current as $index => $record) {
                    fputcsv($handle, $this->getVisiableFields($record, $original[$index]));
                }
            });
            fclose($handle);
        };

        response()->stream($response, 200, $this->getHeaders())->send();

        exit;
    }
}
  1. 在app/Admin/bootstrap.php中添加以下代码
use Encore\Admin\Grid\Exporter;
use App\Admin\Extensions\MyCsvExporter;

Exporter::extend('export', MyCsvExporter::class);
//     export为我设置的别名, 你们可以任意改成其他的

3.在需要的地方使用

        $grid->exporter('export');
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容