| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | <?phpnamespace App\Service;use App\Exports\MyExport;use App\Model\Header_ext;use Illuminate\Support\Facades\Route;class IOService extends Service{    public function apiExport($request){        list($status,$data) = $this->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];    }}
 |