原js代码

// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'xx/xx/index',
        del_url: 'xx/xx/del',
        table: 'xx',
    },
    pagination:true,
    pageSize:10,
    pageList:[10,20,50,100,'All'],
    exportTypes: ['excel'], //'json', 'xml',  'txt', 'doc', 'csv',
    exportOptions: {
        type: 'excel', 
        onMsoNumberFormat: function(cell, row, col) {
            return (row > 0 && col == 0) ? '\\@' : '';
        }
    }
});

在列表页增加导出按钮

<div class="panel-body">
    <div id="myTabContent" class="tab-content">
        <div class="tab-pane fade active in" id="one">
            <div class="widget-body no-padding">
                <div id="toolbar" class="toolbar">
                    {:build_toolbar('refresh,delete')}
                    <a href="javascript:;" class="btn btn-success btn-export" title="{:__('Export')}" id="btn-export-file"><i class="fa fa-download"></i> {:__('Export')}</a>
                </div>
                <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
                       data-operate-verify="{:$auth->check('xx/xx/xx')}"
                       width="100%">
                </table>
            </div>
        </div>
    </div>
</div>

js文件中增加如下代码

function Removedu(data){
    var ids = [];
    $.each(data, function (i, j) {
        if(ids.indexOf(j.id)===-1){
            ids.push(j.id);
        }
    });
    return ids;
}


$(document).on("click", ".btn-export", function () {
    var ids = Table.api.selectedids(table);
    var page = Removedu(table.bootstrapTable('getData'));
    var all = table.bootstrapTable('getOptions').totalRows;
    Layer.confirm("请选择导出的选项!<form action='" + Fast.api.fixurl("exam/record/exportout") + "' method='get' target='_blank'><input type='hidden' name='ids' value='' /><input type='hidden' name='filter' ><input type='hidden' name='op'><input type='hidden' name='search'><input type='hidden' name='columns'></form>", {
        title: '导出数据',
        btn: ["选中项(" + ids.length + "条)", "本页(" + page.length + "条)", "全部(" + all + "条)"],
        success: function (layero, index) {
            console.log('btn0:');
            $(".layui-layer-btn a", layero).addClass("layui-layer-btn0");
        }, yes: function (index, layero) {
            if(ids.length == 0){
                layer.msg('未勾选数据!');
                return false;
            }
            console.log('btn1:',ids);
            submitForm(ids.join(","), layero);
            return false;
        },
        btn2: function (index, layero) {
            console.log('btn2:',page);
            if(page.length == 0){
                layer.msg('空数据!');
                return false;
            }
            submitForm(page.join(","), layero);
            layer.close(index);
            return false;
        },
        btn3: function (index, layero) {
            console.log('btn3:');
            submitForm("all", layero);
            return false;
        }
    })
});
var submitForm = function (ids, layero) {
    var options = table.bootstrapTable('getOptions');
    console.log(options);
    var columns = [];
    $.each(options.columns[0], function (i, j) {
        if (j.field && !j.checkbox && j.visible && j.field != 'operate') {
            columns.push(j.field);
        }
    });
    var search = options.queryParams({});
    $("input[name=search]", layero).val(options.searchText);
    $("input[name=ids]", layero).val(ids);
    $("input[name=filter]", layero).val(search.filter);
    $("input[name=op]", layero).val(search.op);
    $("input[name=columns]", layero).val(columns.join(','));
    $("form", layero).submit();
};

后台待增加如下代码

use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;


public function exportout()
{
    if ($this->request->isGet()) {
        $ids = $this->request->get('ids');
        $columns = $this->request->get('columns');
        //设置过滤方法
        $this->request->filter(['strip_tags']);
        //如果发送的来源是Selectpage,则转发到Selectpage
        if ($this->request->request('keyField')) {
            return $this->selectpage();
        }
        if(empty($ids)){
            $this->error('数据不能为空');
        }
        // 跨模型搜索可以重新定义搜索字段名称
        $this->changeName(["exam_member.openid"=> "examMember.openid"]);
        if($ids === 'all'){
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            // halt($where);
            $list = $this->model
                ->with(['ExamMember','ExamLab'])
                ->field('exam_record.*')
                ->where($where)
                ->select();
        }else{
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $list = $this->model
                ->with(['ExamMember','ExamLab'])
                ->field('exam_record.*')
                ->where("exam_record.id in (".$ids.")")
                ->where($where)
                ->select();
        }

        $initForm = [
                array('title' => 'Id', 'field' => 'id', 'width' => 10,'type' => 'number'),
                array('title' => '姓名', 'field' => 'name', 'width' => 20,'type' => 'string'),
                array('title' => '年龄', 'field' => 'age', 'width' => 20,'type' => 'string'),
        ];

        $fields = array_column($initForm,'field');
        $titles = array_column($initForm,'title','field');
        $widths = array_column($initForm,'width','field');
        $types = array_column($initForm,'type','field');
        $columnsarr = $this->alphabet($fields);
        $spreadsheet = new Spreadsheet();
        $worksheet = $spreadsheet->getActiveSheet();
        //设置标题名称
        $worksheet->setTitle('用户列表');
        $starkey = key($columnsarr);
        end($columnsarr);
        $endkey = key($columnsarr);
        $worksheet->getStyle($starkey.':'.$endkey)->getAlignment()->setHorizontal('center');//halt($columnsarr);
        foreach ($columnsarr as $key => $value) {
            $worksheet->setCellValue($key.'1', $titles[$value]);
            $worksheet->getColumnDimension($key)->setWidth($widths[$value]);//设置列宽
        }
        $j = 2;
        foreach ($list as $k => &$v){
            // 逻辑代码
            foreach($columnsarr as $key=>$val){
                if($types[$val] == 'string'){
                    $worksheet->setCellValueExplicit($key.$j,$v[$val],DataType::TYPE_STRING);
                }else{
                    $worksheet->setCellValue($key.$j,$v[$val]);
                }
            }
            $j++;
        }

        $total = count($list);
        $file_name = '用户列表' .date('YmdHis').$total.'.xlsx';
        // 客户端文件下载
        header('Content-Type:application/vnd.ms-excel');
        header('Content-Disposition:attachment;filename='.$file_name);
        header('Cache-Control:max-age=0');
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        ob_end_clean();
        $writer->save('php://output');
        exit;
    }

}

protected function alphabet($arr)
{
    $newarr = [];
    foreach($arr as $k=>$v){
        $y = ($k / 26);
        if ($y >= 1) {
            $y = intval($y);
            $key = chr($y+64).chr($k-$y*26 + 65);
            $newarr[$key] = $v;
        } else {
            $key = chr($k+65);
            $newarr[$key] = $v;
        }
    }
    return $newarr;
}

changeName方法代码如下

/*
* 修改筛选请求字段名称
* @param String $old 请求的字段名称
* @param String $new 需要修改的字段名称
*/
public function changeName($fields = array())
{
    $f = json_decode($_GET['filter'], true);
    $res = [];
    foreach($fields as $old => $new){
        // @符屏蔽错误,偷懒没写验证
        @$s = $f[$old];
        if ($s != '') {
            unset($f[$old]);
            $f[$new] = $s;
            $_GET['filter'] = json_encode($f);
        }
    }
    $res["filter"] = json_encode($f);
    $f = json_decode($_GET['op'], true);
    foreach($fields as $old => $new){
        @$s = $f[$old];
        if ($s != '') {
            unset($f[$old]);
            $f[$new] = $s;
            $_GET['op'] = json_encode($f);
        }
    }
    $res["op"] = json_encode($f);
    $this->request->get($res);
}
最后修改:2024 年 10 月 29 日
如果觉得我的文章对你有用,请随意赞赏