Dcat-admin添加Excel导出功能流程步骤

2023-06-01 00:00:00 dcat

这是dcat-admin导出功能,dact-admin导入功能文件之前有记录,有兴趣的可以自行翻阅

1.添加扩展maatwebsite/exce

composer require maatwebsite/excel

2.新增dcatAdmin的GridTool文件

php artisan admin:action
...

//选择[3]

Which type of action would you like to make?:
...
[3] grid-tool
...

//设置grid-tool的文件名

InspectionItemsPostExportTool


InspectionItemsPostExportTool文件

/**
  *  接收参数 * InspectionItemsPost constructor
  * @param null $filename
  * @param $title
  */
 public function __construct($filename = null, $title = '')
 {
     parent::__construct($title);
     $this->title = $title;
 }
 /**
  * @return string
  */
 protected $title = '导出巡检信息';
 /**
  *  按钮的样式 * @var string
  */
 protected $style = 'btn btn-outline-info';
 /**
  *  业务处理 * @param Request $request
  * @return Response
  */
 public function handle(Request $request)
 {
     // 获取文件名
     $filename = $request->get('filename');
     // 这里有一个 admin_route 路由,接下来在 route.php 文件添加
     return $this->response()->download(admin_route('inspection-item-posts.export', [
         'filename' => $filename,
     ]);
 }


3.新增控制器导出方法

 /**
  *  巡检记录数据的导出
  * @param Request $request
  * @return BinaryFileResponse
  */
 public function export(Request $request)
 {
     $filename = $request->get('filename');
     ob_end_clean();
     // 这里面有一个 InspectionItemPostExport 文件,接下来通过 php artisan make:export 命令创建
     return Excel::download(new InspectionItemPostExport(), $filename . '.xlsx');
 }


4.新增控制器路由

 // 记着:单个方法的路由一定要放到 resource 资源路由前面
 $router->get('inspection-item-posts/export', 'InspectionItemPostControlle[email protected]')->name('inspection-item-posts.export');


5.添加导出按钮

在控制器的grid方法中引入这个tool按钮文件

/**
  * Make a grid builder.
  *
  * @return Grid
  */
 protected function grid()
 {
     return Grid::make(new InspectionItemPost(['productionLine', 'inspectionPoint', 'inspectionItem', 'user']), function (Grid $grid) {
         $grid->column('id')->sortable();
         // 引入导出工具按钮
         $grid->tools(function (Grid\Tools $tools) use ($grid) {
             // 导出
             $tools->append(new InspectionItemsPostExportTool('巡检问题信息', '导出巡检问题信息'));
         });
     });
 }


6.创建导出文件

php artisan make:export InspectionItemPostExport

7.InspectionItemPostExport 文件的方法

// 我这里实现了几个接口
// FromCollection 必须实现 collection() 方法
// ShouldAutoSize 不需要实现接口,自动设定 excel 表格 column 的宽度
// WithDrawings 必须实现 drawings() 方法,可以在 excel 表格中添加图片(图片需是本地地址)
// WithColumnWidths 必须实现 columnWidths() 可以设定对应列的宽,可与 ShouldAutoSize 一起使用,不过本设定优先
class InspectionItemPostExport implements FromCollection, ShouldAutoSize, WithDrawings, WithColumnWidths
{
     // 最总数据
     private $data;
     // 图片数据
     private $imageData;
     /**
     *  构造方法
     * InspectionItemPostExport constructor.
     */
     public function __construct()
     {
         // 表头设定
         $this->data = $this->createData();
     }
     /**
      *  数组转集合 
      * @return Collection
      */
     public function collection()
     {
          return new Collection($this->data);
     }
     /**
      *  业务代码 
      * @return array|string[][]
       */
     public function createData()
     {
         $headTitle = [
             '编号',
             '提交类型',
             '生产线',
             '巡检点',
             '观察项',
             '巡检人',
             '紧急状态',
             '问题图片',
             '问题说明',
             '创建时间',
         ];
         $bodyData = [];
         $data = InspectionItemPost::with('productionLine:id,name')
             ->with('inspectionPoint:id,name')
             ->with('inspectionItem:id,name')
             ->with('user:id,name')
             ->get();
         if (empty($data)) {
             return [$headTitle];
         }
         // 数据循环
         foreach ($data as $k => $item) {
             $arr[0] = $item->id;
             $arr[1] = Arr::get(InspectionItemPostRepositories::TYPE_OPTION, $item->type, '无');
             $arr[2] = $item->productionLine->name ?? '';
             $arr[3] = $item->inspectionPoint->name ?? '';
             $arr[4] = $item->inspectionItem->name ?? '';
             $arr[5] = $item->user->name ?? '';
             $arr[6] = Arr::get(InspectionItemPostRepositories::STATUS_OPTION, $item->status, '无');
             $arr[7] = '';    // 这里设置为空为后续添加图片腾出地方
             $this->imageData[] = $url;
             $arr[8] = $item->remark;
             $arr[9] = $item->created_at;
             $bodyData[] = $arr;
         }
         // 清除掉 $arr
         unset($arr);
         return [$headTitle, $bodyData];
     }
     /**
      *  绘画 * @return array|BaseDrawing|BaseDrawing[]
       */
     public function drawings()
     {
         $result = [];
         foreach ($this->imageData as $k => $v) {
             // 如果存在全连接跳出
             if (strpos($v, 'http') === 0 || strpos($v, 'https') === 0) {
                 continue;
             }
             // 如果图片不存在跳出
             if (!Storage::exists($v)) {
                 continue;
             }
             $k += 2;
             ${'drawing' . $k} = new Drawing();
             ${'drawing' . $k}->setName('问题图片');
             ${'drawing' . $k}->setDescription('问题图片');
             //图片路径
             ${'drawing' . $k}->setPath(Storage::path($v));
             ${'drawing' . $k}->setHeight(50);
             //设置图片列
             ${'drawing' . $k}->setCoordinates('H' . $k);
             $result[] = ${'drawing' . $k};
         }
         return $result;
     }
     /**
      *  列宽限制 * @return int[]
      */
     public function columnWidths(): array
     {
         return [
             'A' => 10,
             'B' => 15,
             'C' => 15,
             'D' => 15,
             'E' => 40,
             'F' => 10,
             'G' => 10,
             'H' => 20,
             'I' => 30,
             'J' => 20,
         ];
     }
}

相关文章