thinkphp使用phpoffice读取Excel并写入数据库

读取Excel

使用Thinkphp5.1+Office扩展,composer添加依赖

"require": {
    
    
        "php": ">=5.6.0",
        "phpoffice/phpspreadsheet": "^1.6",
    },

设置执行时间和内存限制,经过测试1M左右的xlsx文件,需要设置100M以上

ini_set('max_execution_time', '0');
ini_set('memory_limit', '650M');

直接指文件地址:

$inputFileType = IOFactory::identify('.' . $excel_file); //传入Excel路径
$excelReader = IOFactory::createReader($inputFileType); //这里需要注意它是根据内置的规则判断的文件类型,不是读取的扩展名
$PHPExcel = $excelReader->load('.' . $excel_file); // 载入excel文件
$sheet = $PHPExcel->getActiveSheet(); // 读取工作表
$data = $sheet->toArray();//要导入的数据 第一行是表头

MySQL批量插入数据

最开始使用模型在循环中insert,效率极低。一小时也就能写入几千条数据。
本来想自己拼接insert values(),values(),后面嫌麻烦,改用insertAll。当数据量比较大的时候,我们可以使用array_slice,或者array_chunk把大数组拆分为小数组,防止内存过高。

$chunk_result = array_chunk($log_data, 1000);
        foreach ($chunk_result as $new_list) {
    
    
            Db::name('import_log')->insertAll($new_list);
        }

或者使用下面的:

$num = 100;//每次导入条数
$limit = ceil(count($add_data) / $num);
for ($i = 1; $i <= $limit; $i++) {
    
    
        $offset = ($i - 1) * $num;
        $data = array_slice($add_data, $offset, $num);
        $result = $model->insertAll($data);
};

Cli下运行

php D:/phpcode/Join_system/public/index.php cli/change/import_follow

猜你喜欢

转载自blog.csdn.net/abc8125/article/details/112934534