laravel及layui 导出

博客围绕大数据导出需求展开,前端采用layui,后端使用laravel。需求是导出商品列表和渠道列表数据。介绍两种方法,一是用layui自带语法前端导出,能解决渠道列表导出,但商品列表会超时;二是用Laravel - Excel 3后端导出,可基本解决商品列表导出,但需限制列数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

框架 :

前端 : layui 后端 : laravel

需求 :

导出商品列表(6000多条数据),渠道列表(100条数据)

方法一 :

使用layui自带的table.exportFile(id, data, type)语法,在前端直接导出数据

过程 :

代码 :

<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
      <button class="layui-btn layui-btn-sm" lay-event="export">导出</button>
    </div>
  </script>
// 头工具栏事件
table.on('toolbar(test)', function (obj) {
  if (obj.event == 'export') {
    $.ajax({
      url : '{{ route('order_build.export') }}',
      type: 'get',
      data: {//可查询的数据
        goods_name    : $('input[name="goods_name"]').val(),
        order_id      : $('input[name="order_id"]').val()
      }
    }).done(function (data) {
      table.exportFile(tableIns.config.id, data, 'csv');
    });
  }
});
...
public function export(Request $request, OrderBuild $order_build)
{
    if ($request->filled('goods_name')) {
        $order_build = $order_build->where(
            'order_build.goods_name',
            'like',
            '%' . $request->input('goods_name') . '%'
        );
    }
   
    if ($request->filled('order_id')) {
        $order_build = $order_build->where('order_build.order_id', $request->input('order_id'));
    }
    // 排序
    $order_build = $order_build->orderBy('order_build.create_time', 'desc');
    $order_build = $order_build->get();
	//格式化导出数据
    foreach ($order_build as $key=>$value) {
        $order_build[$key]['order_id'] = $value['order_id']."\t";
        $order_build[$key]['subcustomer_id'] = $value['subcustomer_id']."\t";
        $order_build[$key]['linkmanphone'] = $value['linkmanphone']."\t";
    }

    return response()->json($order_build);
}
...

结果 :

  1. 需要配合头工具栏事件使用,否则会出现可以导出全部数据,不能导出查询数据的问题
  2. 可以解决渠道列表的导出问题,不能解决商品列表的导出问题,数据太多,会出现超时问题

方法二 :

使用Laravel-Excel 3 的导出功能,后端实现导出功能

过程 :

HTML
<a href="javascript:;" class="layui-btn layui-btn-sm" onclick="exporturl()" id="export">导出</a>
jQuery
function exporturl () {
    var goods_id      = $('input[name="goods_id"]').val();
    var supplier_name = $('input[name="supplier_name"]').val();
    var goods_name    = $('input[name="goods_name"]').val();
    $('#export').attr('href', '/goods/export' +
      '?goods_id=' + goods_id
      + '&supplier_name=' + supplier_name
      + '&goods_name=' + goods_name);
  }
//控制器
namespace Inspur\Goods\Controller;

use Maatwebsite\Excel\Facades\Excel;

...
public function export(Request $request)
{
    return Excel::download(new GoodsExport(
        $request->input('goods_id'),
        $request->input('goods_name'),
        $request->input('supplier_name')
    ), 'goods.csv');
}
...

//GoodsExport文件
<?php

namespace Inspur\Goods\Exports;
use Inspur\Goods\Models\Goods;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
class GoodsExport implements FromQuery, WithHeadings, WithMapping
{
    use Exportable;

    public function __construct($goods_id, $goods_name, $supplier_name)
    {
        $this->goods_id = $goods_id;
        $this->goods_name = $goods_name;
        $this->supplier_name = $supplier_name;
    }
	//添加表头
    public function headings(): array
    {
        return [
            '商品 ID',
            '服务商名称',
            '商品名称'
        ];
    }
	
	//通过添加  WithMapping, 可以控制每一列的数据,格式化列
    public function map($goods): array
    {
        return [
            $goods->goods_id . "\t",
            $goods->supplier_name,
            $goods->goods_name
        ];
    }
	//查询导出数据
    public function query()
    {
        $goods = new Goods();
        $goods = $goods->query()
            ->selectRaw('*')
            ->leftJoin('goods_supplier as s', 'goods_info.supplier_id', '=', 's.supplier_id');
        if ($this->goods_id) {
            $goods = $goods->where(
                'goods_info.goods_id',
                'like',
                '%' . $this->goods_id . '%'
            );
        }

        if ($this->goods_name) {
            $goods = $goods->where(
                'goods_name',
                'like',
                '%' . $this->goods_name . '%'
            );
        }

        if ($this->supplier_name) {
            $goods = $goods->where(
                'supplier_name',
                'like',
                '%' . $this->supplier_name . '%'
            );
        }

        $goods->orderBy('goods_info.create_time', 'desc');

        return $goods;
    }
}

结果 :

  1. 要限制导出的列的数量,可导出10列,6000行数据,不能导出全表数据
  2. 基本解决了商品列表的导出问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值