数据导出

model-grid内置的导出功能只是实现了简单的csv格式文件的导出,如果遇到文件编码问题或者满足不了自己需求的情况,可以按照下面的步骤来自定义导出功能

Laravel-Excel v3.*

v1.6.12版本之后增加了对Laravel-Excel 3.*版本的导出支持。

首先按照文档安装好Laravel-Excel

然后创建导出类:

  1. <?php
  2. namespace App\Admin\Extensions;
  3. use Encore\Admin\Grid\Exporters\ExcelExporter;
  4. class PostsExporter extends ExcelExporter
  5. {
  6. protected $fileName = '文章列表.xlsx';
  7. protected $columns = [
  8. 'id' => 'ID',
  9. 'title' => '标题',
  10. 'content' => '内容',
  11. ];
  12. }

然后在Grid中使用这个导出类:

  1. use App\Admin\Extensions\PostsExporter;
  2. $grid->exporter(new PostsExporter());

通过上面的$columns设置,导出时只会导出三个指定的三个字段,如果你要导出所有的字段,指定按照顺序指定每一个字段的名称即可

  1. class PostsExporter extends ExcelExporter
  2. {
  3. protected $fileName = '文章列表.xlsx';
  4. protected $headings = ['ID', '标题', '内容' ... ];
  5. }

数据修改

按照上面的方法,会将数据库中存储的原始数据导出,如果你希望对数据进行预处理,参考下面的方式:

  1. <?php
  2. namespace App\Admin\Extensions\Export;
  3. use Encore\Admin\Grid\Exporters\ExcelExporter;
  4. use Maatwebsite\Excel\Concerns\WithMapping;
  5. class UsersExporter extends ExcelExporter implements WithMapping
  6. {
  7. protected $fileName = '用户列表.xlsx';
  8. protected $columns = [
  9. 'id' => 'ID',
  10. 'name' => '姓名',
  11. 'status' => '状态',
  12. 'profile.homepage' => '主页',
  13. ];
  14. public function map($user) : array
  15. {
  16. return [
  17. $user->id,
  18. $user->name,
  19. $user->status ? 'yes' : 'no'; // 字段数据替换
  20. data_get($user, 'profile.homepage'), // 读取关联关系数据
  21. ];
  22. }
  23. }

Laravel-Excel v2.*

本示例用Laravel-Excel作为excel操作库,当然也可以使用任何其他excel库

首先安装好它:

  1. composer require maatwebsite/excel:~2.1.0
  2. php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

然后新建自定义导出类,比如app/Admin/Extensions/ExcelExpoter.php:

  1. <?php
  2. namespace App\Admin\Extensions;
  3. use Encore\Admin\Grid\Exporters\AbstractExporter;
  4. use Maatwebsite\Excel\Facades\Excel;
  5. class ExcelExpoter extends AbstractExporter
  6. {
  7. public function export()
  8. {
  9. Excel::create('Filename', function($excel) {
  10. $excel->sheet('Sheetname', function($sheet) {
  11. // 这段逻辑是从表格数据中取出需要导出的字段
  12. $rows = collect($this->getData())->map(function ($item) {
  13. return array_only($item, ['id', 'title', 'content', 'rate', 'keywords']);
  14. });
  15. $sheet->rows($rows);
  16. });
  17. })->export('xls');
  18. }
  19. }

然后在model-grid中使用这个导出类:

  1. use App\Admin\Extensions\ExcelExpoter;
  2. $grid->exporter(new ExcelExpoter());

有关更多Laravel-Excel的使用方法,参考laravel-excel/docs