fastadmin 表格数据导入

记录:fastadmin 表格数据导入

php代码

在Backend.php文件中增加读取文件数据并返回代码

php 复制代码
    /**
     * 读取文件数据并返回
     * @return array
     */
    protected function readFile($file)
    {        
        if (!$file) {
            $this->error(__('Parameter %s can not be empty', 'file'));
        }
        
        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
        // //获取上传文件后缀
        // $temp = explode("/",$file);
        // $filename = end($temp);
        // $filePath = ROOT_PATH . "public" .DS. "uploads" .DS. date('Ymd').DS.$filename;

        if (!is_file($filePath)) {
            $this->error(__('No results were found'));
        }
        //实例化reader
        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
            $this->error(__('Unknown data format'));
        }
 
        if ($ext === 'csv') {
            $file = fopen($filePath, 'r');
            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
            $fp = fopen($filePath, "w");
            $n = 0;
            while ($line = fgets($file)) {
                $line = rtrim($line, "\n\r\0");
                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
                if ($encoding != 'utf-8') {
                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
                }
                if ($n == 0 || preg_match('/^".*"$/', $line)) {
                    fwrite($fp, $line . "\n");
                } else {
                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
                }
                $n++;
            }
            fclose($file) || fclose($fp);

            $reader = new Csv();
        } elseif ($ext === 'xls') { 
            // // 使用iconv转换文件编码至UTF-8
            // $convertedFilePath = iconv('original-input-charset', 'UTF-8', file_get_contents($filePath));
        
            // // 将转换后的内容写回文件
            // file_put_contents($filePath, $convertedFilePath);
            $reader = new Xls();
        } else {
            $reader = new Xlsx();
        }

        //加载文件
        try {

            // $spreadsheet = IOFactory::load($filePath);
            // $worksheet = $spreadsheet->getActiveSheet();
 
            // foreach ($worksheet->getRowIterator() as $row) {
            //     $cellIterator = $row->getCellIterator();
            //     $cellIterator->setIterateOnlyExistingCells(false);
            //     foreach ($cellIterator as $cell) {
            //         if ($cell !== null) {
            //             $value = $cell->getValue();
            //             echo $value . ' ';
            //         }
            //     }
            //     echo PHP_EOL;
            // }


            $PHPExcel = $reader->load($filePath); //加载文件
            if (!$PHPExcel) {
                $this->error(__('Unknown data format'));
            }                    
            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);

            //读取第一行字段名
            $fields = [];
            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $fields[] = $val;
                }
            }

            //读取行数据
            $row = [];
            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
                $values = [];
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $values[] = is_null($val) ? '' : (string)$val;
                }

                $row[] = array_combine($fields, $values);
            }
        } catch (Exception $exception) {
            $this->error($exception->getMessage());
        }

        if (!$row) {
            $this->error(__('No rows were updated'));
        }
        return $row;
    }

处理导入数据文件

php 复制代码
    /**
     * 重写import方法
     */
    public function import()
    {
        $file = $this->request->request('file'); //'file'为文件字段名

        $data = $this->readFile($file);
        $data = array_reverse($data);
        $chejian = new \app\admin\model\Chejian();
        $kaoheshuxing_arr = [
            '质量' => 'zhiliang',
            '产量' => 'chanliang',
        ];
        $data_insert = [];
        foreach ($data as $row){
            $ii = '';
            foreach (array_values($row) as $k => $v){
                if($v){
                    $ii = $v;
                }
            }
            if(empty($ii)){
                continue;
            }
            
            $vva = [];
            foreach ($row as $key => $vo) {               
                if(in_array($key,$this->sqlfieldname())){
                    if($key == '车间名称'){
                        if($vo){
                            $chejian_id_arr = [];
                            foreach(explode(',', $vo) as $vo_val){
                                $chejian_id = $chejian->where(['chejian_name'=>$vo_val])->value('id');
                                if(!$chejian_id){
                                    $this->error('车间:'.$vo_val.' 不存在,请先把此车间录入系统');
                                }
                                $chejian_id_arr[] = $chejian_id;
                            }
                            $vva[$this->sqlfield($key)] = implode(',', $chejian_id_arr);
                        }
                    }elseif($key == '考核属性'){
                        if($vo){
                            $flag_arr = [];
                            foreach(explode(',', $vo) as $vo_val){                                
                                if(!isset($kaoheshuxing_arr[$vo_val])){
                                    $this->error('考核属性错误:'.$vo_val.',考核属性只能是:质量,产量,销售,人资,采购,财务');
                                }
                                $flag_arr[] = $kaoheshuxing_arr[$vo_val];
                            }
                            $vva[$this->sqlfield($key)] = implode(',', $flag_arr);
                        }
                    }else{
                        $vva[$this->sqlfield($key)] = $vo;
                    }
                    
                }else{
                    $this->error('列名称错误:'.$key);
                }
            }
            if( $vva ){   
                if(isset($vva['nickname']) && $vva['nickname']){
                    $vva['jointime'] = time();
                    $data_insert[] = $vva;
                }
                unset($vva);
            }
        }
        if(!$data_insert){
            $this->error('未检测到有效的数据,姓名必填');
        }
        $res = $this->model->allowField(true)->validate(true)->saveAll($data_insert);
        unlink(ROOT_PATH.'public'.$file);
        if ($res === false) {
            $this->error('导入失败:'.$this->model->getError());
        }
        $this->success('导入成功');
    }

    // 验证-可传输字段
    public function sqlfieldname()
    {
        return ['姓名','手机号','身份证号','车间名称','考核属性','质量考核系数','产量考核系数'];
    }

    // 替换-可传输字段
    public function sqlfield($key)
    {

        $data= [
            '姓名'=>'nickname',
            '手机号'=>'mobile',
            '身份证号'=>'idnumber',
            '车间名称'=>'chejian_ids',
            '考核属性'=>'flag',
            '质量考核系数'=>'zhiliang_xishu',
            '产量考核系数'=>'chanliang_xishu',
        ];
        return $key?$data[$key]:$data;
    }

html代码

html 复制代码
{:build_toolbar('import')}
<a href="__ROOT__/public/uploads/user.xlsx" class="btn btn-success btn-export" title="{:__('Export')}" ><i class="fa fa-download"></i>{:__('下载模版')}</a>
                        
相关推荐
小白跃升坊3 小时前
PHP2Shell:AI 两天挖出 9.2 分漏洞,让全球 70% 网站连夜打补丁!1Panel 已经把修复版本封装好,推到了你的应用商店里。
php·开源安全·1panel·ai安全·漏洞披露
Json____6 小时前
PHP 突发严重安全漏洞,AI 开始改变网络安全的攻防方式
人工智能·web安全·php·it学习·wwwoop.com
catchadmin6 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
Web极客码7 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
xuefeiniao8 小时前
PHP2Shell漏洞修复
运维·服务器·php
ServBay8 小时前
AI说代码没漏洞?马上被 PHP 打脸了
aigc·php·ai编程
tq108610 小时前
对PHP漏洞的思考
php
wangruofeng10 小时前
黑色十月:AI 找到的漏洞,两小时数十万次利用
人工智能·安全·php
陌陌龙13 小时前
【紧急预警!PHP 核弹级漏洞 php2shell】
开发语言·php
企业解惑小能手-域智盾系统13 小时前
内网监控软件策略不生效、日志缺失?一套从现象到根因的排查框架
开发语言·php·域智盾