You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP、CodeIgniter、Spreadsheet实现Excel数组自动批量入库

CodeIgniter框架Excel批量入库实现方案

核心实现要点:

  • 解析后的Excel数组总长度直接调用PHP原生count()函数即可获取,无需额外扩展
  • 5000行量级数据禁止逐行单条插入,直接用框架自带的insert_batch()批量插入方法,性能比逐行插入高10~20倍
  • 必须先做入参合法性校验,避免非数组参数传入触发运行报错
  • 注意多数Excel解析库返回的数组索引从0开始,不要硬编码从1开始遍历导致首行数据丢失

原代码存在的逻辑错误:

  1. 还未执行插入操作就先判断$this->db->affected_rows(),逻辑顺序完全颠倒
  2. 循环起始值写死从1开始,会丢失索引为0的第一条数据
  3. 逐行插入的写法在千行级数据量下很容易触发PHP执行超时、数据库连接中断问题
  4. 入参默认值设为整数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:03:21