web-dev-qa-db-ja.com

MaatwebsiteにCSVをインポートする/ Laravel Excel3.1を使用してExcel :: import

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
shhrzl

実際には、Maatwebsite/Laravel-Excelバージョン3でExcelインポート用に追加のクラスを作成する必要はありません。基本的に、バージョン2とほぼ同じ方法でCSVから配列への変換全体を実行できます。

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

import()メソッドの最初のパラメーターは、3.1ではファイルへのパスではなく、作成する必要のあるインポートファイルのクラス名です。

このインポートファイルでは、シートの読み取り方法と、シートを変換する形式(モデルやコレクションなど)を定義できます。

2.1から3.1に移行する最も簡単な方法は、(あなたの場合)を実行してそのようなImportクラスを作成することです。

php artisan make:import CsvDataImport 

質問のコードのように、すべての行を一度に読み取りたい場合は、インポートファイルでToCollection懸念事項を使用できます。

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);

コレクションへのインポートについて詳しく読むことができます ここ

0
piscator

ダウングレードに戻らないでください。最も簡単なインポート方法で、新しい更新バージョン("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;
    }
    }
    ?>
    
  • コントローラファイル内。

     use Excel;
    
    public function importExcel(Request $request) {
    
     $import = new UsersImport();
     $data = \Excel::import($import, request()->file('import_file'));
    
     }
    
0
Maulik Parmar