apiHook($request); if($status != 200) return [false,$data]; $list = $data['data']['data']; $data = $request->all(); $menu_id = $data['menu_id']; $head_list = Header_ext::where('menu_id',$menu_id)->where('del_time',0)->get()->toArray(); $marge = []; foreach ($head_list as &$value){ $positions = explode(':',$value['position']); $value['e_words'] = []; foreach ($positions as $vv){ $value['e_words'][] = $vv; } if(count($positions) === 2) $marge[] = $value['position']; } list($head,$max_row) = $this->setHeadEWordChangeNum($head_list); //初始化一个列数组 $init_row = []; for ($i=0;$i<$max_row;$i++){ $init_row[$i] = ''; } //拼所有的表头,先确认每行的表头 $excel_head = []; $line_max = 0; foreach ($head as $v){ $line = $v['lines'][0]-1; $detail = [ 'key' => $v['key'], 'value' => $v['value'], 'rows' => $v['rows'], 'lines' => $v['lines'], ]; foreach ($v['lines'] as $vv){ if($vv > $line_max) $line_max = $vv; } $excel_head[$line][] = $detail; } //初始化表头的行 $excel_data = []; for ($i=0;$i<$line_max;$i++){ $excel_data[$i] = $init_row; } $key_word = []; foreach ($excel_head as $k=>$v){ foreach ($v as $vv){ $row = $vv['rows'][0]; if(!empty($vv['key'])) $key_word[$vv['key']] = $row; $excel_data[$k][$row] = $vv['value']; } } foreach ($list as $v){ $detail = $init_row; foreach ($key_word as $key=>$vv){ if(isset($v[$key])) $detail[$vv] = $v; } $excel_data[] = $detail; } $excel = (new MyExport())->commonExport( [ 'data' => $data, 'params' => [ 'merge' => $marge ], ]); return [true,$excel]; } /** * 获取具体数据,通过访问页面相同接口 * @param $request * @return array */ public function apiHook($request){ $data = $request->all(); $api = $data['api']; $route = Route::getRoutes(); $return = []; foreach ($route as $v){ $uri = $v->uri(); $action = $v->getAction(); $return[$uri] = $action['uses']; } $class = explode('@',$return[$api]); $use_name = '\\'.$class[0]; $example = new $use_name(); $name = $class[1]; $return = $example->$name($request); return $return; } /** * 将合并定位的excel数据进行处理 * @param $head * @return mixed */ public function setHeadEWordChangeNum($head){ $max_row = 0; foreach ($head as &$v){ $v['rows'] = []; $v['lines'] = []; foreach ($v['e_words'] as $vv){ preg_match_all('/\d+/', $vv, $matches); $number = $matches[0][0]; $v['lines'][] = $number; $row = eWordChangeNum(str_replace($number,'',$vv)); $v['rows'][] = $row; if($row>$max_row) $max_row = $row; } } foreach ($head as &$v){ sort($v['rows']); sort($v['lines']); } return [$head,$max_row]; } }