读取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