Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2通过excel文件更新数据加载时间长_Yii2_Yii2 Basic App_Phpoffice - Fatal编程技术网

Yii2通过excel文件更新数据加载时间长

Yii2通过excel文件更新数据加载时间长,yii2,yii2-basic-app,phpoffice,Yii2,Yii2 Basic App,Phpoffice,我正在使用Yii2创建一个工具来管理团队的工作量。因此,每天我都需要使用Excel将大量数据(大于5k)导入数据库,加载时间通常需要20-30分钟。有没有办法缩短加载时间 请帮我做这个 以下是我使用的代码: public function actionImportExcel() { $inputFile = 'uploads/importexcel/import.csv'; try{ $inputFileType = \PHPExcel_IOFactory::id

我正在使用Yii2创建一个工具来管理团队的工作量。因此,每天我都需要使用Excel将大量数据(大于5k)导入数据库,加载时间通常需要20-30分钟。有没有办法缩短加载时间

请帮我做这个

以下是我使用的代码:

public function actionImportExcel()
{
    $inputFile = 'uploads/importexcel/import.csv';
    try{
        $inputFileType = \PHPExcel_IOFactory::identify($inputFile);
        $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
        $objPHPExcel = $objReader->load($inputFile);
    }catch(Exception $e)
    {
            die('Error');
    }

    $sheet = $objPHPExcel->getSheet(0);
    $highestRow = $sheet->getHighestRow();
    $highestColumn = $sheet->getHighestColumn();

    for( $row = 1; $row <= $highestRow; $row++)
    {
        $rowData = $sheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE);

        if($row == 1)
        {
            continue;
        }
    $test = $rowData[0][0];

    $ext = Sku3d::find()->where(['sku' => $test])->exists();



    if($ext){
        $one = Sku3d::find()->where(['sku' => $test])->one();
        $one->status = $rowData[0][14];
        $one->round = $rowData[0][19];
        $one->source = $rowData[0][29];
        $one->modeler = $rowData[0][30];
        if($one->datesubmit == NULL || $one->datesubmit == ""){
        $one->save();   
        }else{
        $day = DateTime::createFromFormat('Y-m-d', $one->datesubmit);
        $one->monthsubmit=date("Y-m-t", strtotime($one->datesubmit));
        $one->save();
        }
        if($rowData[0][14] == "Approved"){
            $one->approvedate = $rowData[0][16];
            if($one->approvedate == NULL || $one->approvedate == ""){
            $one->save();   
            }else{
            $one->approvemonth=date("Y-m-t", strtotime($one->approvedate));
            $one->save();
            }
        }else{
            $one->approvedate = Null;
            $one->approvemonth = Null;
        }

        $one->save();

        // print_r($one->getErrors());

        // die;

    }
    else{


        }

    }       

}
公共函数actionImportExcel()
{
$inputFile='uploads/importexcel/import.csv';
试一试{
$inputFileType=\PHPExcel\u IOFactory::identify($inputFile);
$objReader=\PHPExcel\u IOFactory::createReader($inputFileType);
$objPHPExcel=$objReader->load($inputFile);
}捕获(例外$e)
{
死亡(“错误”);
}
$sheet=$objPHPExcel->getSheet(0);
$highestRow=$sheet->getHighestRow();
$highestColumn=$sheet->getHighestColumn();
对于($row=1;$row RANGETORARRAY('A'.$row'.:'.$HIGHESTCLUMN.$row,NULL,TRUE,FALSE));
如果($row==1)
{
继续;
}
$test=$rowData[0][0];
$ext=Sku3d::find()->其中(['sku'=>$test])->存在();
如果($ext){
$one=Sku3d::find()->其中(['sku'=>$test])->one();
$one->status=$rowData[0][14];
$one->round=$rowData[0][19];
$one->source=$rowData[0][29];
$one->modeler=$rowData[0][30];
如果($one->datesubmit==NULL | |$one->datesubmit==“”){
$one->save();
}否则{
$day=DateTime::createFromFormat('Y-m-d',$one->datesubmit);
$one->monthsubmit=date(“Y-m-t”,strotime($one->datesubmit));
$one->save();
}
如果($rowData[0][14]=“已批准”){
$one->approvedate=$rowData[0][16];
如果($one->approvedate==NULL | |$one->approvedate==“”){
$one->save();
}否则{
$one->approvedmonth=日期(“Y-m-t”,标准时间($one->approvedate));
$one->save();
}
}否则{
$one->approvedate=Null;
$one->approvemonth=Null;
}
$one->save();
//打印($one->getErrors());
//死亡;
}
否则{
}
}       
}

谢谢!

当您检查行是否已经存在以及从DB加载行时,您正在执行非常类似的查询

如果希望新记录多于现有记录,可以在周期之前将所有sku加载到阵列中,然后检查sku是否在现有记录中

在循环的
之前:

$existingSkus=Sku3d::find()
->选择(['sku'])
->indexBy(‘sku’)
->列();
然后在您的for循环中:

if (array_key_exists($test, $existingsSkus)) {
    $one = Sku3d::find()->where(['sku' => $test])->one();
    // ...
}
如果希望导入中的大多数行已经存在于数据库中,并且要更新它们,则可以跳过
exists()
查询,直接加载数据

$one=Sku3d::find()->其中(['sku'=>$test])->one();
如果(!空($1)){
//…更新$1中加载的现有行
}否则{
//…创建新行
}
代码中的另一个问题是,您为每个更新的行多次调用save

if($one->datesubmit==NULL | |$one->datesubmit==“”){
$one->save();//第一次保存
}否则{
// ...
$one->save();//第一次保存-else分支
}
// ...
如果($rowData[0][14]=“已批准”){
$one->approvedate=$rowData[0][16];
如果($one->approvedate==NULL | |$one->approvedate==“”){
$one->save();//第二次保存
}否则{
$one->approvedmonth=日期(“Y-m-t”,标准时间($one->approvedate));
$one->save();//第二次保存-else分支
}
}否则{
$one->approvemonth=Null;
}
$one->save();//前一个条件为真时第三次保存,否则第二次保存
您真的需要在完成所有更改之前调用保存吗?在最后执行一次保存比每行执行2或3次保存更快


另外,如果在每次导入中有许多新行,您可能希望使用,而不是为每行创建和保存新模型。

感谢您指出这一点。我已经知道批插入^^_^