fastadmin批量导入的坑——导入失败?日期转换时间戳?日期早了8小时?二三级用户没批量导入权限?

​ 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情  1:

首先,修改assets/js/wxcms/xxxx.js的Table.api.init({})

增加一行

import_url: 'wxcms/xxxx/import',

顺便说一下批量导出的按钮可以在这个文件的table.bootstrapTable里添加红框区域内容即可

2:

然后再到application/admin/view/wxcms/xxxx/index.html新增红框内容

3:然后到application/admin/controller/wxcms/xxxx.php往控制器里增加一个方法

扫描二维码关注公众号,回复: 14282517 查看本文章

 贴心小棉袄已经为各位大佬贴出下面代代码:

public function import(){

    return parent::import();

}
复制代码

4、登录管理员账号,就发现界面显示了一个导入按钮

怀着激动的心,颤抖的手,点击导入按钮,哟,弹出文件选择窗口了,竟然就这样可以了?内心默默赞一句

image.png 好家伙,这么方便!

然后按下导出按钮,导出了一份数据,主要是想获取表头,懒得自己再写表头,然后情况所有数据,留下一条测试数据稍作修改打算测测。

然后把这个文件丢进导入,哦豁!!!绿窗弹出操作成功!!!不会吧不会吧 做完了?我还丧心病狂的报了一天工期,10分钟搞好了???

然后默默赞叹自己真棒棒,一边打算看看新数据,

完犊子了,不是说操作成功吗?怎么列表没有新增数据。

5、找问题

吾日三省吾身,我错哪了,我错哪了,我错哪了?

提示绿绿的操作成功,没有报错返回,但凡它warn一下,红一下,我也能有点方向,如今只能先去数据库康康有没有数据,不看不知道,一看吓一跳,好家伙,一半数据进去了,一半没有,也没找到规律

在/library/traits/Backend.php里的protected function import(){}里看了半天,发现下面这里,原来是将表头和数据库字段的备注做匹配,匹配上了就把Excel的值赋值给数据库里的该字段。因为项目开发中有的备注并没有作为前端显示的样式,类似产品分类在数据库的备注是分类id,在前端写的却是分产品分类名称,因此表头是产品分类,与数据库的字段匹配不上,因此录不进该数据。

天!竟然忽视了这个!!!

改,麻溜的改了过来之后。。。。。

注:打码处的代码是为了填一会的坑加的

6:

改完表头之后,妙啊妙啊可以了?

眼睛瞪得像铜铃。

害!我就知道没这么顺利,时间戳错的,导入方法加个时间转时间戳方法即可

注意引入:

7:

聪明的小伙伴可能已经发现,打码部分还没清空,还有坑。

是的,小洪眉头一皱发现事情并没有那么简单。

为什么?为什么?实际存入的时间比Excel表录入的时间大正好8小时,为啥是正好8小时,不是13个小时14分,为什么不是5分20秒?难道是因为代码世界没有爱情吗?经过一番百度,原来

真相只有一个

获取单元格的类型经过判定后,时间格式类型会成为为Object,这种获取时间的方式会少8个小时。具体解决方法,我用了一个大一就能看懂的方法解决,噗嗤。

噗嗤哈哈哈哈

小棉袄继续贴出参考代码:

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;
                }
            }

            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
                $values = [];
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $cell = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow);
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    if($cell->getDataType()==DataType::TYPE_NUMERIC){  
                        $cellstyleformat = $cell->getStyle($cell->getCoordinate())
                        ->getNumberFormat();  

                        $formatcode = $cellstyleformat->getFormatCode(); 
                        
                        if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) {  
                            $val =DateChange::excelToTimestamp($val);
                            $num = 8*60*60*1000;
                            $val = $val-$num;
                        }
                     
                     }
                    $values[] = is_null($val) ? '' : $val;
                }
                $row = [];
                $temp = array_combine($fields, $values);
                foreach ($temp as $k => $v) {
                    if (isset($fieldArr[$k]) && $k !== '') {
                        $row[$fieldArr[$k]] = $v;
                    }
                }

                if ($row) {
                    $insert[] = $row;
                }
            }
        } catch (Exception $exception) {
            $this->error($exception->getMessage());
        }
复制代码

8:

测试后,写好数据批量录入操作文档,准备发给客户爸爸,好家伙,发现除了超级管理员,其他用户都不显示这个按钮,去看角色组打算编辑权限,发现并没有批量导入这个选项可以勾选。

经过社区一番百度,目前找到两个比较简单的方法:

一个是创始人回答的

​编辑

一个是大佬lihoo回答的

​编辑

我用的是第二个方法,在fa_auth_rule直接加一条rule。然后再到角色组编辑权限即可看到有该权限可以勾选。

但是直接操作数据库,实在是不太好~

要是小伙伴有更简单正常的方法可以告诉小洪~

以上,解决收工

​编辑

\

猜你喜欢

转载自juejin.im/post/7109662265338495013