【问题标题】:How to get excel to array in maatwebsite如何在 maatwebsite 中获取 excel 到数组
【发布时间】:2019-02-27 10:11:30
【问题描述】:

我正在尝试使用最新版本的Laravel-Excel (3.1.9) 将 Excel 文件转换为数组

下面的代码将下载文件:

return Excel::download(new SalesOrderExport('columns'),'test.xlsx')

但我需要将其转换为仅获取数组。我现在不想将此 Excel 数据存储在数据库中。

我尝试使用下面的代码,但它不起作用,因为 load 方法在版本 3 中不可用。

Excel::load($request->file('sampledata'), function ($reader) {
    return response()->json($reader);
});

请分享您对如何从 Excel 获取数组的想法。

【问题讨论】:

    标签: excel laravel maatwebsite-excel laravel-excel


    【解决方案1】:

    我和@narayan 努力将请求的 excel 文件放入数组中。现在我可以使用以下代码正确获取数组

    $rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata')); 
    

    在我的 SalesOrderExport 类中,我只有默认函数,这是抽象方法所必需的。

    namespace App\Exports;
    
    use App\SalesOrder;
    use Maatwebsite\Excel\Concerns\FromCollection;
    
    class SalesOrderExport implements FromCollection
    {
        public function collection()
        {   
            return SalesOrder::all();
        }
    }
    

    我的控制器代码

    public function importTest(Request $request)
    {
        $rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata'));
        return response()->json(["rows"=>$rows]);
    }
    

    在 HTML 中

    <input class="" type="file" name="sampledata" id="sampledata">
    

    我已经通过

    创建了这个导出
    php artisan make:import SalesOrder
    

    附加相关图片

    【讨论】:

    【解决方案2】:

    我添加它是希望有人可以为此获得另一种类型的解决方案。 版本 - "maatwebsite/excel": "^3.1"

    Controller

    $data = Excel::toArray(new UsersImport(), $request->file);
    

    UsersImport

    <?php
        namespace App\Imports;
        use Illuminate\Support\Collection;
        use Maatwebsite\Excel\Concerns\ToCollection;
    
        class UsersImport implements ToCollection
        {
           public function collection(Collection $rows)
           {
           }
        }
    

    Json 数组结果

    array:2 [▼
      0 => array:2 [▼
               0 => "+126785XXXXX"
               1 => "Jhon"
           ]
      1 => array:2 [▼
               0 => "+126784XXXXX"
               1 => "Doe"
           ]
      ]
    

    还有一个奖励, 现在假设你只需要电话号码,然后在控制器中创建一个自定义数组-

    $data = Excel::toArray(new UsersImport(), $request->file);
    $phoneNumbersData= [];
    foreach ($data[0] as $key => $value) {
      $phoneNumbersData[] = $value[0];
    }
    return $phoneNumbersData;
    

    希望,这会对某人有所帮助。

    【讨论】:

      【解决方案3】:

      以下是一些基于使用常用文件输入元素导入 csv 文件的工作示例。就我而言,一旦上传,文件就可以通过请求对象作为“csv_file”访问。

      public function importCSV(Request $request)
      {
          // Get the csv rows as an array
          $theArray = Excel::toArray(new stdClass(), $request->file('csv_file'));
      
          // Get the csv rows as a collection
          $theCollection = Excel::toCollection(collect([]), $request->file('csv_file'));
      
          //etc
      }
      

      【讨论】:

        【解决方案4】:

        我尝试了类似的方法并且效果很好; 在您的导入文件中执行此操作

        use Illuminate\Support\Collection;
        use Maatwebsite\Excel\Concerns\ToCollection;
        
        public function collection(Collection $row)
        {
            return $row;
        }
        

        然后在控制器中,执行此操作;

        $row = Excel::toCollection(new CourseImport, request()->file('course'));
        

        【讨论】:

        • 既然你提到了数组,请像这样使用 toArray() 而不是 toCollection(); $row = Excel::toArray(new CourseImport, request()->file('course'));
        • 有什么办法可以优化 toArray().如果我们的请求中有 20k 条记录?
        【解决方案5】:

        我是这样实现的:

        在我的 UsersImport 类中: 命名空间 App\Imports;

        use App\User;
        use Maatwebsite\Excel\Concerns\ToModel;
        use Maatwebsite\Excel\Concerns\Importable;
        
        class UsersImport implements ToModel
        {
            use Importable;
        
            public function model(array $row)
            {
                return new User([
                   'id' => $row[0]
                ]);
            }
        }
        

        在控制器中:

        $imported_users = (new UsersImport)->toArray(request()->file('excel_file'))[0];
        

        希望对你有帮助。

        【讨论】:

          【解决方案6】:
          1. 使用以下命令创建导入文件。

            php artisan make:import TestImport

          2. 在 TestImport 内部进行如下更改:

            命名空间 App\Imports;

            使用应用\用户; 使用 Illuminate\Support\Collection; 使用 Maatwebsite\Excel\Concerns\ToCollection;

            类 TestImport 实现 ToCollection { 公共函数集合(集合 $rows) { 返回$行; } }

          3. 在 Controller 中进行如下更改:

            // 原代码:$rows = Excel::import(new TestImport, 'test.xlsx');

            $rows = Excel::toCollection(new TestImport, 'test.xlsx');

          【讨论】:

          • 好的,所以这个toArray 函数来自this docs 我看到了这个但不明白。让我看看你的回答。
          • 我认为 load 方法不再在版本 3 中我收到错误 Call to undefined method Maatwebsite\Excel\Excel::load()
          • 再次检查以上内容。
          • 我的问题是在控制器中获取数组而不是在 TestImport 中
          • 答案又变了,它可能会解决你的问题。
          【解决方案7】:

          你应该试试这个:

          $data = Excel::load($request->file('sampledata'), function ($reader) use($table) {
                  $data = $reader->toArray();
                  //here data has all excel data in array.
          });
          

          【讨论】:

          • 我收到此错误"message": "Call to undefined method Maatwebsite\\Excel\\Excel::load()",
          • @NikleshRaut:请看这个link
          • @NikleshRaut:是这样的
          • 不幸的是我知道这就是为什么我在这里要求版本 3
          • @NikleshRaut:好的
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 2016-12-16
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多