fastadmin导入excel并对导入数据处理

情景描述


fastadmin有自带的导入功能,但是不好用,它要求你的表格标题必须跟数据表的备注一致,而且拿到的数据是直接插入数据表,我们无法获取想要的数据并对数据进行处理;而且有时候我们只是想要单纯的读取文件功能,系统自带的无法满足,所以需要对导入功能重写。

重写导入功能


1.打开导入按钮

在你的模板文件中,在工具栏添加import功能即可,如果要自定义导入按钮,可以参考我的另一篇文章fastadmin后台自定义按钮和弹窗-CSDN博客

复制代码
{:build_toolbar('refresh,add,edit,del,import')}

2.js文件添加导入接口链接

在后台对应功能的js文件初始化表格参数配置中添加链接即可

js 复制代码
// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'user/group/index',
        add_url: 'user/group/add',
        edit_url: 'user/group/edit',
        del_url: 'user/group/del',
        multi_url: 'user/group/multi',
        import_url: 'user/group/import', //导入接口链接
        table: 'user_group',
    }
});

3.重写import方法

  • (1)先在application/admin/library/traits/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;
            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') {
                $reader = new Xls();
            } else {
                $reader = new Xlsx();
            }
    
            //加载文件
            try {
                if (!$PHPExcel = $reader->load($filePath)) {
                    $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) ? '' : $val;
                    }
    
                    $row[] = array_combine($fields, $values);
                }
            } catch (Exception $exception) {
                $this->error($exception->getMessage());
            }
    
            if (!$row) {
                $this->error(__('No rows were updated'));
            }
            return $row;
        }
  • (2)在后台控制器 中重写import方法,并调用上面的readFile方法读取数据,然后就可以对数据进行处理

    php 复制代码
    	/**
         * 重写import方法
         */
        public function import()
        {
            $file = $this->request->request('file'); //'file'为文件字段名
            $data = $this->readFile($file);
            foreach ($data as $row){
                //do something
                //var_dump($row);
            }
    
            $this->success('导入成功');
        }

4.添加上传文件类型

如果是刚下载的框架,由于没有配置允许上传的文件类型,导入的时候会报错提示"上传文件格式受限制",则需要添加上传文件类型,直接在配置文件application/extra/upload.php中的mimetype添加需要的文件类型即可

php 复制代码
	/**
     * 可上传的文件类型
     */
    'mimetype'  => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm,xls,xlsx,csv',
相关推荐
愿你天黑有灯下雨有伞18 小时前
Java使用FastExcel实现Excel文件导入
java·excel
爆爆凯18 小时前
Excel 导入导出工具类文档
java·excel
凌康ACG1 天前
springboot打包二次压缩Excel导致损坏
spring boot·后端·excel
诸葛大钢铁2 天前
Excel转PDF的三种方法
笔记·职场和发展·pdf·excel
小小薛定谔2 天前
java操作Excel两种方式EasyExcel 和POI
java·python·excel
CodeCraft Studio2 天前
DHTMLX Suite 9.2 重磅发布:支持历史记录、类Excel交互、剪贴板、拖放增强等多项升级
javascript·excel·交互·表格·dhtmlx·grid·网格
小阳睡不醒2 天前
小白成长之路-Elasticsearch 7.0 配置
大数据·elasticsearch·excel
奋进的孤狼2 天前
【Excel】使用vlookup函数快速找出两列数据的差异项
excel
不讲废话的小白2 天前
解锁高效Excel技能:摆脱鼠标,快速编辑单元格
计算机外设·excel
CodeCraft Studio2 天前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中创建甘特图
python·excel·项目管理·甘特图·aspose·aspose.cells