联系官方销售客服

1835022288

028-61286886

POSCMS 版主:POSCMS负责人
Excel导入时,跳过重复数据,并提示重复数据数量与明细
类型:POSCMS 更新时间:2018-12-19 16:41:48

image.png


如图,在Excel导入插件中,当上传Excel表时,如何判断已有表中,指定某字段的重复数据,最终该数据只导入新数据,并提示重复数据数量与明细?附相关代码。


public function import() {


    if (IS_POST) {
        $table = $this->input->post('table');
        if ($_FILES["file"]["error"] > 0) {
            $this->admin_msg('文件上传失败: '.$_FILES["file"]["error"]);
        } else {
            $ext = substr(strrchr($_FILES["file"]["name"], '.'), 1);
            $file = APPPATH.'cache/'.SYS_TIME.'.'.$ext;
            if (move_uploaded_file($_FILES["file"]["tmp_name"], $file)) {
                if (!is_file($file)) {
                    $this->admin_msg('上传文件移动失败');
                }
                // 提交参数
                $ids = $this->input->post('ids');
                $post = $this->input->post('data');

                /** Include PHPExcel */
                require APPPATH.'Classes/Init.php';
                //建立reader对象
                $PHPReader = new PHPExcel_Reader_Excel2007();
                if(!$PHPReader->canRead($file)){
                    $PHPReader = new PHPExcel_Reader_Excel5();
                    if(!$PHPReader->canRead($file)){
                        $this->admin_msg('不是Excel文件');
                    }
                }

                $sheet = max(0, intval($post['id']) - 1);
                $PHPExcel = $PHPReader->load($file);        //建立excel对象
                $currentSheet = $PHPExcel->getSheet($sheet);        //**读取excel文件中的指定工作表*/
                $allColumn = $currentSheet->getHighestColumn();        //**取得最大的列号*/
                $allRow = $currentSheet->getHighestRow();        //**取得一共有多少行*/
                $data = array();
                for($rowIndex=1;$rowIndex<=$allRow;$rowIndex++){        //循环读取每个单元格的内容。注意行从1开始,列从A开始
                    for($colIndex='A';$colIndex<=$allColumn;$colIndex++){
                        $addr = $colIndex.$rowIndex;
                        $cell = $currentSheet->getCell($addr)->getValue();
                        if($cell instanceof PHPExcel_RichText){ //富文本转换字符串
                            $cell = $cell->__toString();
                        } elseif (is_float($cell)) {
                            $time = PHPExcel_Shared_Date::ExcelToPHP($cell);
                            if ($time > 0) {
                                $cell = gmdate("Y-m-d H:i:s", $time);
                            }
                        }
                        $data[$rowIndex][$colIndex] = $cell;
                    }
                }

                if (!$data) {
                    @unlink($file);
                    $this->admin_msg('Excel文件解析数据失败');
                }

                $count = 0;
                // 数据处理
                foreach ($data as $i => $t) {
                    // 验证行数
                    if ($post['ks'] && $i<$post['ks']) {
                        continue;
                    }
                    // 验证不能为空
                    $yz = 0;
                    $insert = array();
                    foreach ($ids as $id) {
                        if (is_null($t[$post[$id]['excel']])) {
                            $yz = 1;
                            continue;
                        }
                        $value = $t[$post[$id]['excel']];
                        if (isset($post[$id]['func']) && $post[$id]['func'] && function_exists($post[$id]['func'])) {
                            $value = call_user_func($post[$id]['func'], $value);
                        }
                        $insert[$id] = $value;
                    }
                    if ($yz) {
                        continue;
                    }


                    if ($insert) {
                        $this->db->insert($table, $insert);
                        $count ++;
                    }
                }
                @unlink($file);
                $this->admin_msg('共导入'.$count.'个', '', 1);
            } else {
                @unlink($file);
                $this->admin_msg('上传失败');
            }
        }

    }

    $this->template->assign(array(
        'table' => $_GET['table'],
        'abcd' => str_split(strtoupper('abcdefghijklmnopqrstuvwxyz'), 1),
    ));
    $this->template->display('import.html');

}


回帖
  • 黄卿
    #1楼    黄卿
    2018-11-18 20:47:06
    0
    感谢分享
  • frankxie
    #2楼    frankxie
    2018-11-18 21:15:52
    0
    黄卿 哥们,我提的是问题,不是分享呢,看来我得在标题上加个问号。。。
  • 诚接二开/定制/使用解答
    #3楼    诚接二开/定制/使用解答
    2018-11-18 21:28:31
    0
    不是一两句代码能描述清楚,私聊给你做好
  • 黄卿
    #4楼    黄卿
    2018-11-19 10:11:09
    0
    这个插件早就不能用了,官方都不更新了
  • frankxie
    #5楼    frankxie
    2018-11-19 17:22:37
    0
    黄卿 是的,但是这个还是比较实用的一个插件,也不清楚为什么官方就不上架与更新。
  • frankxie
    #6楼    frankxie
    2018-11-19 17:23:10
    0
    诚接二开/定制/使用解答 已经QQ联络你,但是还未得到答复,请QQ私聊。
  • 小青年
    #7楼    小青年
    2018-11-19 18:12:38
    0
    这个插件不适用,没必要用,表太广泛,没有定向表数据导入,不适用
  • frankxie
    #8楼    frankxie
    2018-11-19 20:18:39
    0
    小青年 打算自己做一个定向表数据导入,已经成功一半了,现在需要处理重复数据问题。你还有更好的解决办法吗?麻烦一起分享一下。
  • 秦
    #9楼    秦
    2018-11-28 23:07:03
    0
    我正在找这个Excel插件,能给我一份吗
  • frankxie
    #10楼    frankxie
    2018-11-29 11:15:09
    0
    秦 可以联系我QQ:六一78三个2一个五,一起研究吧。
  • frankxie
    #11楼    frankxie
    2018-12-19 16:41:00
    0
    自己尝试已经将问题解决,并且将官方代码二次开发了一部分,现在作为通用型栏目导入导出,比较好用了。
    image.png

    image.png
    满意答案
  • frankxie
    #12楼    frankxie
    2018-12-19 16:41:48
    0
    问题已解决,自己动手,丰衣足食呀。