如何用PHP、CodeIgniter、Spreadsheet实现Excel数组自动批量入库
CodeIgniter框架Excel批量入库实现方案
核心实现要点:
- 解析后的Excel数组总长度直接调用PHP原生
count()函数即可获取,无需额外扩展 - 5000行量级数据禁止逐行单条插入,直接用框架自带的
insert_batch()批量插入方法,性能比逐行插入高10~20倍 - 必须先做入参合法性校验,避免非数组参数传入触发运行报错
- 注意多数Excel解析库返回的数组索引从0开始,不要硬编码从1开始遍历导致首行数据丢失
原代码存在的逻辑错误:
- 还未执行插入操作就先判断
$this->db->affected_rows(),逻辑顺序完全颠倒- 循环起始值写死从1开始,会丢失索引为0的第一条数据
- 逐行插入的写法在千行级数据量下很容易触发PHP执行超时、数据库连接中断问题
- 入参默认值设为整数0,和预期的数组类型不匹配,缺少类型校验逻辑
修正后的可直接运行的模型代码如下:
<?php defined('BASEPATH') or exit('No direct script access allowed'); class Home_model extends CI_Model{ public function __construct() { parent::__construct(); } public function insert_batch($dataSalva = []) { // 入参校验:非数组、空数组直接返回失败 if (!is_array($dataSalva) || empty($dataSalva)) { return 0; } // 自动获取传入数组总长度 $totalarray = count($dataSalva); // SQL Server对单条SQL长度有默认限制,分块插入每批1000行最稳妥,避免SQL过长报错 $chunkSize = 1000; $dataChunks = array_chunk($dataSalva, $chunkSize); $totalAffected = 0; foreach ($dataChunks as $chunk) { $this->db->insert_batch('chargeback_excel', $chunk); $totalAffected += $this->db->affected_rows(); } return $totalAffected > 0 ? 1 : 0; } }
实际使用注意事项:
- 如果Excel解析结果第一行是表头字段,记得在传入模型前先删除表头行,避免把表头当成业务数据插入
- 导入控制器开头可以加
set_time_limit(30);临时放宽PHP执行时间限制,避免大文件导入超时 - 如果业务有去重要求,提前在数据库对应字段加唯一索引,或者插入前先做查重逻辑,避免写入重复脏数据
- 如果需要获取准确的插入成功行数,直接返回
$totalAffected即可,不需要固定返回1/0
内容的提问来源于stack exchange,提问作者Filipe Rabelo Lana
相关产品推荐
相关产品推荐

