场景: 导出每个企业(分后台) 的 用户 在某一天的上岗状态。
废话不多说 直接上代码
controller
public function export() { //这里是自己获取参数去查数据 $time = input('time'); $timestamp = strtotime($time); $timestamp_end = $timestamp + 86400-1; //这里是通过列表缓存搜索等查 // //从缓存中获得列表页面的参数 // $arr = Cache::get("param-{$this->auth->id}"); // //导出页面直接使用列表页的搜索参数 // $this->request->get($arr); // list($where, $sort, $order, $offset, $limit) = $this->buildparams(); // $list = $this->model // ->where($where) // ->order($sort, $order) // ->paginate(50000); //是当前管理员di $admin_id = $this->auth->id; $list = $this->model->where('admin_id',$admin_id) ->order('id asc') ->select(); foreach ($list as $row) { //这里是数据处理 $row['test_status'] = '未答题'; //未答题 $weida_tests = UserEveryTest::where('user_id',$row['id']) ->where('duicuo',0) ->where('createtime','between time',[$timestamp,$timestamp_end]) ->count(); $dui_tests = UserEveryTest::where('user_id',$row['id']) ->where('duicuo',1) ->where('createtime','between time',[$timestamp,$timestamp_end]) ->count(); $cuo_tests = UserEveryTest::where('user_id',$row['id']) ->where('duicuo',2) ->where('createtime','between time',[$timestamp,$timestamp_end]) ->count(); if( $weida_tests >0 ){ $row['test_status'] = '未答题'; }elseif($cuo_tests > 0){ $row['test_status'] = '不可上岗'; }elseif($dui_tests > 0 && $weida_tests == 0 && $cuo_tests == 0){ $row['test_status'] = '可上岗'; } if($row['is_guan'] == 1){ $row['is_guan'] = '管理员'; }else{ $row['is_guan'] = '员工'; } } $out = []; //获得要导出的数据列表 // $export_list = $list->toArray()["data"]; $out = []; //利用循环把列表中需要导出到xls的字段找出来进行处理 foreach($list as $k =>$v){ $out[$k]["nickname"] = $v["nickname"]; $out[$k]["category_name"] = $v["category_name"]; $out[$k]["is_guan"] = $v["is_guan"]; $out[$k]["test_status"] = $v["test_status"]; } //这是表头字段名称 $title = array ( 0 => '姓名', 1 => '部门', 2 => '身份', 3 => '状态', ); //字段值 $key = [ 'nickname', 'category_name', 'is_guan', 'test_status' ]; //保存的文件名 $filename = "user_test_status".date('Y-m-d H:i:s',time()); $excel = new Export(); //此类后面有说明 $excel->getFile($filename,$title,$key,$out); //文件名称 标题 字段 数据 }
index.html
<div class="widget-body no-padding"> <div id="toolbar" class="toolbar" style="display:flex;"> {:build_toolbar('refresh,edit,del')} <input type="text" class="form-control datetimepicker datetimepickerY" name="year" value="{:date('Y-m-d')}" id="year" data-index="12" autocomplete="off"> <a href="javascript:;" class="btn btn-danger" id="excel_dc"> {:__('导出')}</a> </div> <table id="table" class="table table-striped table-bordered table-hover table-nowrap" data-operate-edit="{:$auth->check('user/user/edit')}" data-operate-del="{:$auth->check('user/user/del')}" width="100%"> </table> </div>
user.js
// 为表格绑定事件 Table.api.bindevent(table); require(['bootstrap-datetimepicker'], function () { var options = { format: 'YYYY-M-D', icons: { time: 'fa fa-clock-o', date: 'fa fa-calendar', up: 'fa fa-chevron-up', down: 'fa fa-chevron-down', previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-history', clear: 'fa fa-trash', close: 'fa fa-remove' }, showTodayButton: true, showClose: true }; $('.datetimepickerY').parent().css('position', 'relative'); $('.datetimepickerY').datetimepicker(options); }); $("#year").on("dp.update", function(){ var that = this; $("select[name='quarter']").val(''); $("select[name='month']").val(''); var options = table.bootstrapTable('getOptions'); options.pageNumber = 1; options.queryParams = function (params) { params.year = $(that).val(); // 值 console.log(params); return params; }; table.bootstrapTable('refresh', {}); return false; }); $('#excel_dc').click(function(){ var times = $("#year").val(); var url='user/export?time='+times; window.open(url); }); },
有这个class 这边是直接放到app/common/library/
<?php namespace app\common\library; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; class Export { /** * @param String $title 表格标题 * @param Array $headerArr 标题行 * @param Array $fieldArr 字段名称 * @param object/Array $data 数据 * @return void * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception * @throws \PHPExcel_Writer_Exception * 字段名称与标题行 一一对应 */ public function getFile($title, $headerArr, $fieldArr, $data){ set_time_limit(0);//设置时间限制 @ini_set('memory_limit','256M'); // 防止内存溢出 //实例化一个新的excel文档 $excelObj = new Spreadsheet(); $excelObj->getProperties()->setCreator('灵朗设计')->setTitle($title); //获取当前操作sheet的对象 $worksheet = $excelObj->getActiveSheet(); //设置表头 设置标题行 // 参数:列、行 if($headerArr){ foreach ($headerArr as $k=>$v){ $worksheet->setCellValueByColumnAndRow($k+1,1,$v); } } $styleArrayFirstRow = [ 'font' => [ 'bold' => true, ] ]; $highestColumn = $worksheet->getHighestColumn(); $worksheet->getStyle('A1:' . $highestColumn . '1' )->applyFromArray($styleArrayFirstRow); // 设置数据 if($data){ foreach ($data as $k => $val){ $val = is_array($val) ? $val :$val->toArray(); // 每列数据,与标题行 一一对应 if($fieldArr){ foreach ($fieldArr as $key => $value){ $temp = $val; $tempKeyArr = explode('.',$value); if($tempKeyArr){ foreach ($tempKeyArr as $kk=>$vv){ if(isset($temp[$vv])){ $temp = $temp[$vv] ; } } } $temp = is_array($temp) ? '' : $temp; //数据格式化 if(($value == 'mobile') || ($value == 'phone') || ($value == 'license_no')){ $temp = ' '.$temp; }elseif (preg_match('/time$/', $value)){ $temp = is_numeric($temp) ? date('Y-m-d H:i:s',$temp) : $temp; } $worksheet->setCellValueByColumnAndRow($key+1,$k+2,$temp); } } } } // MIME 协议,文件的类型,不设置,会默认html header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // MIME 协议的扩展 header('Content-Disposition:attachment;filename='.$title .'.xlsx'); // 缓存控制 header('Cache-Control:max-age=0'); $write = IOFactory::createWriter($excelObj, 'Xlsx'); $write->save('php://output'); exit; } }
点击导出直接就下载了