public function actionImport()
{
try {
$columns_keys = [];
$columns = Yii::$app->db->getTableSchema('_crm_product')->columns;
foreach ($columns as $column) {
$columns_keys[$column->comment] = $column->name;
}
unset($columns);
// web 目录下
$pFilename = trim(Yii::$app->request->get('filename'), '/');
// 先用 Reader_Excel2007 读取
$PHPReader = new \PHPExcel_Reader_Excel2007();
// 当前的 Reader_Excel2007 可以阅读该文件吗?
if (! $PHPReader->canRead($pFilename)) {
// 再用 Excel5 读取
$PHPReader = new \PHPExcel_Reader_Excel5();
// 当前的 Reader_Excel5 可以阅读该文件吗?
if (! $PHPReader->canRead($pFilename)) {
return $this->error('无法读取该文件');
}
}
// 载入 xls,xlsx 文件
$PHPExcel = $PHPReader->load($pFilename);
// 获得活动表
$objActiveSheet = $PHPExcel->getActiveSheet();
// 行迭代器
$rows = [];
foreach ($objActiveSheet->getRowIterator() as $row) {
// 单元格迭代器
$cellIterator = $row->getCellIterator();
// 将迭代器设置为只循环存在的单元格, false=不存在
$cellIterator->setIterateOnlyExistingCells(false);
foreach ($cellIterator as $key => $cell) {
if ($row->getRowIndex() == 1) {
$columns[] = $columns_keys[$cell->getValue()];
} else {
$rows[$row->getRowIndex()][] = trim($cell->getValue(), '\' ="/');
}
}
}
} catch (ErrorException $e) {
return $this->error('错误号:' . $e->getCode() . '<br>错误行:' . $e->getLine() . '<br>错误信息:' . $e->getMessage());
}
// 在主服务器连接上开始事务
$db = Yii::$app->db;
$transaction = $db->beginTransaction();
try {
$queryBuilder = $db->queryBuilder;
$chunk_rows = array_chunk($rows, 5000);
$count = 0;
foreach ($chunk_rows as $chunk_row) {
$sql = $queryBuilder->batchInsert('_crm_product', $columns, $chunk_row);
$count += $db->createCommand($sql)->execute();
}
$message = '成功导入 <code>' . $count . '</code> 条记录';
// 提交记录
$transaction->commit();
return $this->ok($message);
} catch (Exception $e) {
// 记录回滚
$transaction->rollBack();
return $this->error('错误号:' . $e->getCode() . '<br>错误信息:' . $e->getMessage());
}
}
检查是否使用了innodb存储引擎