Php 使用Excel::Import在Maatwebsite/Laravel Excel 3.1上导入CSV

Php 使用Excel::Import在Maatwebsite/Laravel Excel 3.1上导入CSV,php,laravel,maatwebsite-excel,laravel-excel,Php,Laravel,Maatwebsite Excel,Laravel Excel,我已将Maatwebsite/Laravel Excel从2.1升级到3.1。有些方法已被弃用 下面是2.1版的代码 $data = Excel::load($path, function($reader) {})->get()->toArray(); 当我使用2.1时,它工作正常,但升级后,它出错了 调用未定义的方法Maatwebsite\Excel\Excel::load() 对于3.1版,我尝试更改为 $data = Excel::import($path, function

我已将Maatwebsite/Laravel Excel从2.1升级到3.1。有些方法已被弃用

下面是2.1版的代码

$data = Excel::load($path, function($reader) {})->get()->toArray();
当我使用2.1时,它工作正常,但升级后,它出错了

调用未定义的方法Maatwebsite\Excel\Excel::load()

对于3.1版,我尝试更改为

$data = Excel::import($path, function($reader) {})->get()->toArray();
我知道这可能不是正确的语法

这里是我使用2.1开发时的完整代码

$path = $request->file('csv_file')->getRealPath();

    if ($request->has('header')) {
        $data = Excel::import($path, function($reader) {})->get()->toArray();
    } else {
        $data = array_map('str_getcsv', file($path));
    }

    if (count($data) > 0) {
        if ($request->has('header')) {
            $csv_header_fields = [];
            foreach ($data[0] as $key => $value) {
                $csv_header_fields[] = $key;
            }
        }
        $csv_data = array_slice($data, 0, 8);

        $csv_data_file = CsvData::create([
            'csv_filename' => $request->file('csv_file')->getClientOriginalName(),
            'csv_header' => $request->has('header'),
            'csv_data' => json_encode($data)
        ]);
    } else {
        return redirect()->back();
    }

    return view('import.import_field', compact( 'csv_header_fields', 'csv_data', 'csv_data_file'));

如何在3.1版上修复此错误?

导入()方法的第一个参数在3.1版中不再是文件的路径,而是必须创建的导入文件的类名

在此导入文件中,可以定义如何读取图纸,以及要将图纸转换为何种格式,例如模型或集合

从2.1迁移到3.1的最简单方法是通过运行(在您的情况下)创建这样的导入类:

如果您想一次读取所有至行,如在问题代码中,您可以使用导入文件中的
来收集
关注点:

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

class CsvDataImport implements ToCollection
{
    public function collection(Collection $rows)
    {
        // Use the $rows collection to create your CsvData model.
    }
}
在控制器中,可以按如下方式调用导入:

use App\Imports\CsvDataImport;
use Maatwebsite\Excel\Excel;    

Excel::import(new CsvDataImport, $path);

您可以阅读有关导入到集合的详细信息

不要返回降级,您可以使用最简单的导入方法轻松使用新的更新版本(“maatwebsite/excel”:“~3.1.0”

更新Composer.json

 "require": {
    **"maatwebsite/excel": "~3.1.0"**
},
使用新版本的步骤。。
  • 创建导入以在cmd中运行此命令
php artisan make:import UsersImport

  • 它将在app\imports\UserImport.php中创建导入

    <?php
    namespace App\Imports;
    
    use Illuminate\Support\Collection;
    use Maatwebsite\Excel\Concerns\ToCollection;
    use Maatwebsite\Excel\Concerns\WithHeadingRow;
    
    class UserImport implements ToCollection,WithHeadingRow
    {
    
    public function collection(Collection $rows)
    {
    
        return $rows;
    
    }
    
    // headingRow function is use for specific row heading in your xls file
    public function headingRow(): int
    {
        return 3;
    }
    }
    ?>
    

实际上,在Maatwebsite/Laravel Excel版本3中,不需要为Excel导入创建任何额外的类。基本上,您可以使用与版本2中几乎相同的方式完成整个CSV到阵列的转换:

    $path = $request->file('csv_file')->getRealPath();
    $data = \Excel::toArray('', $path, null, \Maatwebsite\Excel\Excel::TSV)[0];

最让我困扰的是,供应商地图是荷兰语的对不起,只是我的意见你的意思是什么?除了“Maatwebsite”之外,所有内容都是英文的,因为这恰好是开发包的公司的荷兰名称。但是如何获取数组中的文件数据呢
 use Excel;

public function importExcel(Request $request) {

 $import = new UsersImport();
 $data = \Excel::import($import, request()->file('import_file'));

 }
    $path = $request->file('csv_file')->getRealPath();
    $data = \Excel::toArray('', $path, null, \Maatwebsite\Excel\Excel::TSV)[0];