Hướng dẫn laravel export large data to excel - laravel xuất dữ liệu lớn sang excel

Tôi cần phải xuất một lượng lớn hàng để xuất sắc. Tôi đang sử dụng Laravel-Excel. Tôi đã làm theo tất cả các đề xuất được đưa ra trong tài liệu để xuất cơ sở dữ liệu lớn.

// routes/web.php
Route::post('/dashboard/export', [DashboardController::class, 'export'])->middleware('auth');

// app/Http/Controllers/DashboardController.php
class DashboardController extends Controller
{

    public function export(Request $request)
    {
        $filename = str::random(20).".xlsx";
        (new UsersExport($request->all()))->queue($filename, 'public')->chain([
            new NotifyUserOfCompletedExcelExport(request()->user(),$filename ),
        ]);
        
        return json_encode([
            'message' => "You will receive email with download link once export is complete."
        ]);
        
    }
}


// app/Exports/UsersExport.php
class UsersExport implements FromCollection, WithHeadings
{
    use Exportable;
    public function __construct($config)
    {
        
        $this->config = $config;
    }
    
    public function collection()
    {
        $mains = DB::table('mains')->select('name', 'email', 'designation', 'country', 'university', 'discipline', 'subject', 'school_or_department');
        


        //filter one
        $one = $this->config['filterOne']['column'];
        if ($one != null) {
            // dd($one);
            $mains = $mains->where($one, 'like', $this->config['filterOne']['value'] . "%");
        }

        $mains = $mains->offset($this->config['page'] * $this->config['num_entries_per_page']);
        $mains = $mains->limit($this->config['num_entries_per_page']);
        $mains = $mains->where('delete', 0);
        return $mains->get();
    }
    
    public function headings(): array
    {
        return [
            'NAME', 'EMAIL', 'DESIGNATION', 'COUNTRY', 'UNIVERSITY', 'DISCIPLINE', 'SUBJECT', 'SCHOOL_OR_DEPARTMENT'
        ];
    }
}

Rõ ràng bạn có thể thấy, tôi đang xếp hàng xuất khẩu. Tôi chạy lệnh trong thiết bị đầu cuối.

php artisan queue:work

Nó cung cấp đầu ra như dưới đây cho số lượng lớn các hàng (30000), sau đó xếp hàng: thoát khỏi công việc.queue:work exits.

[2021-11-12 05:13:56][151] Processing: Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 05:14:17][151] Processed:  Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 05:14:25][152] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 05:14:39][152] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
.
.
.
.
[2021-11-12 05:17:48][167] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet

Tôi nghĩ về việc thay đổi giới hạn bộ nhớ PHP trong tệp php.ini

memory_limit = 512M

Tuy nhiên, nó không hoạt động.

Đối với số lượng nhỏ hàng đợi hàng: Công việc hoạt động đúng (không thoát) và đầu ra được đưa ra dưới đây.

[2021-11-12 03:21:19][112] Processing: Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 03:21:22][112] Processed:  Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 03:21:24][113] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:26][113] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:27][114] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:28][114] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:29][115] Processing: Maatwebsite\Excel\Jobs\CloseSheet
[2021-11-12 03:21:30][115] Processed:  Maatwebsite\Excel\Jobs\CloseSheet
[2021-11-12 03:21:30][116] Processing: Maatwebsite\Excel\Jobs\StoreQueuedExport
[2021-11-12 03:21:31][116] Processed:  Maatwebsite\Excel\Jobs\StoreQueuedExport
[2021-11-12 03:21:31][117] Processing: App\Jobs\NotifyUserOfCompletedExcelExport
[2021-11-12 03:21:35][117] Processed:  App\Jobs\NotifyUserOfCompletedExcelExport

Câu hỏi của tôi là :-

-> Làm thế nào tôi có thể xuất một số lượng lớn các hàng như vậy?

-> Tôi đang làm gì sai?

-> Có cách nào thay thế để đạt được giống nhau không?

-> Tôi có nên tạo một dịch vụ riêng để xuất dữ liệu trong Excel bằng một số ngôn ngữ khác không?

-> Có phải là một ý tưởng tốt để thực hiện xử lý nặng như vậy trên máy chủ đầu tiên sản xuất không?

Xuất dữ liệu lớn trong tệp Excel hoặc CSV [Laravel]

Bạn có thể đang sử dụng

php artisan queue:work
1 với dòng mã sau để xuất báo cáo. Nếu vậy, đối với ít dữ liệu hơn, đây không phải là một vấn đề. Nhưng nếu bạn muốn tải xuống dữ liệu lớn, mã này không được khuyến nghị.

Excel::download(new SomeExport, $name . '.xlsx');

Chà, hãy để tôi giới thiệu một thư viện cho

php artisan queue:work
2 để xuất dữ liệu lớn một cách dễ dàng. Nó được gọi là
php artisan queue:work
3. Và đây là những bước bạn cần làm theo.

Cài đặt FastExcel

Cài đặt FastExcel bởi Trình soạn thảo bằng lệnh sau trong thiết bị đầu cuối của bạn.

composer require rap2hpoutre/fast-excel

// If you get this error
// PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted
// Use this command instead
COMPOSER_MEMORY_LIMIT=-1 composer require rap2hpoutre/fast-excel

Mở tệp

php artisan queue:work
4 và thêm dòng mã sau trong khóa
php artisan queue:work
5.

'FastExcel' => Rap2hpoutre\FastExcel\Facades\FastExcel::class,

Làm thế nào để sử dụng nó?

use Rap2hpoutre\FastExcel\FastExcel;
use App\User;

public function exportUser() {
    // Load users
    $users = User::all();
    
    // Export all users in excel
    FastExcel::data($users)->export('file_name.xlsx');
    
    // Or Export all users in csv
    FastExcel::data($users)->export('file_name.csv');
}

Mã trên sẽ xuất tệp của bạn trong vị trí máy chủ của bạn. Nhưng nếu bạn muốn thực sự tải xuống thì sao? Vâng, điều đó cũng dễ dàng và đây là mã mẫu cho nó.

use Rap2hpoutre\FastExcel\FastExcel;
use App\User;

public function downloadUser() {
    // Load users
    $users = User::all();
    
    // Export all users in excel
    return FastExcel::data($users)->download('file_name.xlsx');
    
    // Or Export all users in csv
    return FastExcel::data($users)-> download('file_name.csv');
}

Xin lưu ý, đừng quên thêm

php artisan queue:work
6 trước tên lớp
php artisan queue:work
7. Nếu bạn quên quay lại, bạn sẽ không thể tải xuống tệp. Nó sẽ chỉ chuyển hướng bạn đến màn hình trống.

Tải dữ liệu lớn?

Điều gì sẽ xảy ra nếu bạn muốn tải hơn 10 triệu dữ liệu? Vâng, điều đó cũng có thể. Đi qua những điều sau đây để tải các dữ liệu lớn.

php artisan queue:work
0

Sử dụng

php artisan queue:work
8, bây giờ ứng dụng đã sẵn sàng để quản lý bộ dữ liệu lớn một cách dễ dàng. Ngoài ra, tôi đã thêm tùy chọn để tùy chỉnh cột Excel khi cần thiết. Trong ví dụ trên, tôi đã thêm tên đầu tiên và tên cuối cùng. Bạn có thể thêm như bạn muốn.

Và đó là tất cả những gì bạn cần biết để xuất hoặc tải xuống bộ dữ liệu lớn. Nếu bạn có bất kỳ vấn đề hoặc không thể chạy dự án, bạn có thể hỏi tôi trong phần bình luận.

Hy vọng blog này là hữu ích.

Cảm ơn bạn.