YII下使用PHPExcel导出数据到mysql数据库

/**
 * 从Excel取出数据后批量导入数据库
 * 插入数据方式:insert into tb (...) values(...),(...)...;
 * @author 开发者 2015-12-08
 */
public function actionImportData(){
    //使用时注释掉下面一行
    Yii::app()->end("You don't have enough permissions to use this function");

    set_time_limit(0);//设置不超时
    @ini_set('memory_limit', '512M');//设置PHP能使用的内存大小

    $allFile = array('sg','aq','bh','cl','cy','fz','gm','gx','ht','jj','kw','lq','qz','wc','xs','zc');
    foreach((array)$allFile as $file) {
        try{
            //文件路径
            $filePath = Yii::getPathOfAlias('webroot')."/content/importSource/".$file.".xls";
            if(!file_exists($filePath)) {
                throw new Exception('The file named '.$file.'.xls is not exist');
            }

            //加载phpexcel
            $phpexcel = ExcelUtils::importPhpExcel($filePath);
            if(!$phpexcel) {
                throw new Exception('load phpexcel failed');
            }

            //包装数据
            $totalRow =  count($phpexcel->getRowDimensions());
            $array = $arr = array();
            for($row=2; $row <= $totalRow; $row++) {

                $userID = $phpexcel->getCell('A'.$row)->getValue();
                if(empty($userID)) {
                    continue; //过滤userID为空的行数
                } else {
                    $arr['UserID'] =  $file.'_'.$userID;
                }

                $arr['Name'] = $phpexcel->getCell('B'.$row)->getValue();
                $arr['Login'] = $phpexcel->getCell('E'.$row)->getValue();

                $email = $phpexcel->getCell('D'.$row)->getValue();
                $arr['Email'] = VerifyUtils::checkEmail($email) ? $email : ''; //过滤邮箱号

                $phone = $phpexcel->getCell('C'.$row)->getValue();
                $arr['Phone'] = VerifyUtils::checkMobile($phone) ? $phone : ''; //过滤手机号

                $otherData = $phpexcel->getCell('F'.$row)->getValue();
                list($areaID,$schoolType,$schoolID) = explode('|',$otherData);
                $arr['AeraID'] = $areaID ?: intval($areaID);
                $arr['SchoolType'] = $schoolType ?: intval($schoolType);
                $arr['SchoolID'] = $schoolID ?: intval($schoolID);

                $array[] = $arr;
            }

            //数据链接数据
            $dataBaseInfo = array(
                'dataBase' => 'yourDataBase',
                'tableName' => 'yourTableName',
                'userName' => 'root',
                'password' => '',
                'charSet' => 'utf8',
            );
            $result = $this->_insertMultData($array,$dataBaseInfo,$server = null);
            $msg = $result > 0 ? 'successfully' : 'failed';
            echo 'The File named '.$file.'.xls has been added '.$msg.'<br>';
            unset($totalRow,$array,$arr); //释放内存
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

}

/**
 * 数据库插入多行记录
 * @param array $datas
 * 格式:array(
        array('id'=>'123','name'=>'wuzhc'),
        array('id'=>'123','name'=>'wuzhc')
 * )
 * 键值对应数据库的列
 *
 * @param array $dataBaseInfo
 * 格式:array(
        'dataBase' => 'ytwo',
        'tableName' => 'tbtmpuser',
        'userName' => 'root',
        'password' => '',
        'charSet' => 'utf8',
 * )
 *
 * @param $server
 * 格式:array(
        'dbConnection' => 'weike',
        'tableName' => 'tbtmpuser',
 * )
 *
 * @return int 成功返回一个大于0的值
 * @author 开发者 2015-12-09
 */
private function _insertMultData(array $datas, array $dataBaseInfo, array $server){

    if($server) {
        //服务器数据库链接
        $connection = Yii::app()->$server['dbConnection']; //例如Yii::app()->db
        $tableName = $server['tableName'];
    } else {
        //方便本地测试
        if(empty($dataBaseInfo)) {
            return 0;
        }
        $connection = new CDbConnection("mysql:host=localhost;dbname=".$dataBaseInfo['dataBase'],$dataBaseInfo['userName'],$dataBaseInfo['password']);
        $connection->charset = $dataBaseInfo['charSet'];
        $tableName = $dataBaseInfo['tableName'];
    }

    $command = $connection->createCommand();
    $sql = '';
    $params = array();
    $i = 0;
    foreach ($datas as $columns) {
        $names = array();
        $placeholders = array();
        foreach ($columns as $name => $value) {
            if (!$i) {
                $names[] = $connection->quoteColumnName($name);
            }
            if ($value instanceof CDbExpression) {
                $placeholders[] = $value->expression;
                foreach ($value->params as $n => $v)
                    $params[$n] = $v;
            } else {
                $placeholders[] = ':' . $name . $i;
                $params[':' . $name . $i] = $value;
            }
        }
        if (!$i) {
            $sql = 'INSERT INTO ' . $connection->quoteTableName("$tableName")
                . ' (' . implode(', ', $names) . ') VALUES ('
                . implode(', ', $placeholders) . ')';
        } else {
            $sql .= ',(' . implode(', ', $placeholders) . ')';
        }
        $i++;
    }
    $result = $command->setText($sql)->execute($params);
    unset($sql,$params); //释放内存
    return $result;
}

说明:该方法是在YII框架下编写的,PHPExcel的加载方式也已经被包装过,自己测试了一下,所有excel文件共6.34M,一共导入数据34989条,用时一分钟,希望给位大神给点意见

你可能感兴趣的:(YII下使用PHPExcel导出数据到mysql数据库)