Export csv, xls, pdf ... trong PHP
Bài đăng này đã không được cập nhật trong 6 năm
Mở đầu
Hiện nay việc code và xuất dữ liệu đã khá phổ biến, các dạng file PDF, CSV, XLS và mỗi lần chúng ta có yêu cầu xuất file thì phải tìm khắp nơi các thư viện, hoặc code tay..Hôm nay mình xin giới thiệu và cùng mọi người tìm hiểu một thư viện có thể dùng xuất nhiều dạng file mình mong muốn..cụ thể mình dùng cho framework laravel php.
Nội dung
1. Cài đặt
Bạn di chuyển vào projiect và dùng composer để cài đặt thư viện
composer require maatwebsite/excel
Khi cài xong thì bước tiếp theo vào ServiceProvider và thêm vào file config/app.php
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
'aliases' => [
...
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
Rồi sau đó từ terminal chúng ta publish config vừa rồi
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
Sau khi publish thành công nó sẽ tạo ra một file config excel trong config/excel.php và đến đây mình đã cài đặt xong..giờ sẽ dùng nó nhé
2. Một ví dụ đơn giản
Đầu tiên ta tạo ra một class export
php artisan make:export PostsExport --model=Post
Bạn có thể thấy file này nằm ở app/Exports và nơi đây chính là nơi bạn tùy chỉnh file excel hoặc csv ... của mình
<?php
namespace App\Exports;
use App\Post;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class PostsExport implements FromCollection, WithHeadings
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return Post::all();
}
public function headings(): array
{
return [
'#',
'title',
'body',
'created_at',
'updated_at',
];
}
}
và Controller
<?php
namespace App\Http\Controllers;
use App\Exports\PostsExport;
use App\Post;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class PostController extends Controller
{
public function exportCSV()
{
return Excel::download(new PostsExport, 'post.csv');
}
}
Bạn cũng có thể lưu lại trên server
return Excel::store(new PostsExport, 'post.csv');
Lưu ý: đối với lưu thì tên file bao gồm cả đường dẫn và nó đc lưu tại
storage/appvì vậy bạn muốn lưu vào đâu thì hãy thêmpathchuẩn nhé.
Kết quả khi mình xuất file CSV

trên là mình thực hiện lưu hoặc xuất thẳng file CSV ra một cách đơn giản..Giờ mình đi nghịch xem nó thế nào một chút nhé.
3. Một chút custom
Giờ ta muốn truyền tham số và xuất một file theo số truyền vào nha..ở đây mình truyền và xuất ra file csv có chứa id mình truyền vào thôi...mà mình k thích viết logic trong file PostsExport.php cho lắm nên mình sẽ tạo và viết trong file PostService nha.
app/Exports/PostsExport.php
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class PostsExport implements FromCollection, WithHeadings
{
/**
* @return \Illuminate\Support\Collection
*/
protected $id;
public function __construct($id)
{
$this->id = $id;
}
public function collection()
{
$postService = app()->make('App\PostService');
$post = $postService->getPostById($this->id);
return $post;
}
public function headings(): array
{
return [
'#',
'title',
'body',
'created_at',
'updated_at',
];
}
}
PostController
<?php
namespace App\Http\Controllers;
use App\Exports\PostsExport;
use App\Post;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class PostController extends Controller
{
public function exportCSV(Request $request)
{
if ($id = $request->all('id')) {
return Excel::download(new PostsExport($id), 'post.csv');
}
}
}
PostService
<?php
namespace App;
class PostService
{
public function getPostById($id)
{
return Post::find($id);
}
}
và kết quả chúng ta nhận được này

Trên đây là custom một chút..mình có thể custom nhiều hơn.
Một ví dụ nữa đó là mình thay vào việc export dữ liệu từ collection thì mình cũng có thế export từ mảng..đơn giản là ta cho mảng đó vào collect() của thư viện là được.
public function collection()
{
$postService = app()->make('App\PostService');
$post = $postService->getPostById($this->id);
//post is an Array
return collect($post);
}
3. Kết luận
Qua bài viết hi vọng giúp các bạn yêu thích hơn việc code..vì rất nhiều điều thú vị..Qua bài trên giúp bạn có hướng đi khi gặp phải task liên quan tới phần export này.
4. Tài liệu tham khảo
All rights reserved