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往控制器里增加一个方法
贴心小棉袄已经为各位大佬贴出下面代代码:
public function import(){
return parent::import();
}
4、登录管理员账号,就发现界面显示了一个导入按钮
怀着激动的心,颤抖的手,点击导入按钮,哟,弹出文件选择窗口了,竟然就这样可以了?内心默默赞一句
好家伙,这么方便!
然后按下导出按钮,导出了一份数据,主要是想获取表头,懒得自己再写表头,然后情况所有数据,留下一条测试数据稍作修改打算测测。
然后把这个文件丢进导入,哦豁!!!绿窗弹出操作成功!!!不会吧不会吧 做完了?我还丧心病狂的报了一天工期,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。然后再到角色组编辑权限即可看到有该权限可以勾选。
但是直接操作数据库,实在是不太好~
要是小伙伴有更简单正常的方法可以告诉小洪~
以上,解决~收工~