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',
相关推荐
~在杰难逃~12 小时前
关于订单信息的Excel数据分析报告
笔记·数据分析·excel·数据分析报告
生产队队长18 小时前
SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能
spring boot·excel
麋鹿会飞但不飘20 小时前
EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法
java·spring boot·excel
Eiceblue20 小时前
Python 实现Excel XLS和XLSX格式相互转换
vscode·python·pycharm·excel
if时光重来1 天前
springboot项目实现导出excel动态设置表头
spring boot·后端·excel
我是Superman丶1 天前
【工具】Java Excel转图片
java·python·excel
說詤榢1 天前
判断2个excel文件差异的条数
excel
镜花照无眠1 天前
Excel爬虫使用实例-百度热搜
爬虫·excel
一念之间 一心向阳2 天前
PHP 使用Spreadsheet写excel缓存导致内存不断增加
php·excel
zhang-ge2 天前
python提取pdf表格到excel:拆分、提取、合并
python·pdf·excel