Export csv, xls, pdf ... trong PHP
Bài đăng này đã không được cập nhật trong 5 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/app
vì vậy bạn muốn lưu vào đâu thì hãy thêmpath
chuẩ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