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

使用PHPExcel按列读取Excel并导入数据库的实现问题

Excel数据导入数据库:实现A1取值+B2-B8循环读取逻辑

需求回顾

  • 先读取A1单元格数据,作为每条记录的公共标识(如id_solicitud)
  • 循环读取N组数据,每组取B列连续7行(如B2-B8、B9-B15等),对应原TXT逻辑中的批量读取规则
  • 将每组数据按字段映射后插入数据库

解决代码(基于PhpSpreadsheet)

// 加载Excel文件(确保已正确初始化PhpSpreadsheet依赖)
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load($inputFileName);
$worksheet = $spreadsheet->getActiveSheet();

// 获取A1单元格的值,作为id_solicitud
$id_solicitud = trim($worksheet->getCell('A1')->getValue());

// 初始化分组起始行,每组占用7行B列数据
$startRow = 2;
$rowsPerGroup = 7;

// 循环处理每组数据
while (true) {
    // 检查当前组首行B列是否有数据,无数据则终止循环
    $currentCell = $worksheet->getCell("B{$startRow}");
    if (empty(trim($currentCell->getValue()))) {
        break;
    }

    $groupData = [];
    // 读取当前组的7行B列数据
    for ($i = 0; $i < $rowsPerGroup; $i++) {
        $rowNum = $startRow + $i;
        $cellValue = trim($worksheet->getCell("B{$rowNum}")->getValue());
        $groupData[] = $cellValue;
    }

    // 组装数据库插入数据,与原TXT逻辑保持一致
    $medida_data = [
        'id_solicitud'       => $id_solicitud,
        'programa'           => 1,
        'orden'              => $groupData[0],
        'ges'                => $groupData[1],
        'dimension'          => $groupData[2],
        'actividades'        => $groupData[3],
        'ejecucion'          => $groupData[4],
        'fecha_comprometida' => date('Y-m-d', strtotime($groupData[5])),
        'fecha_creacion'     => date('Y-m-d'),
        'plazo'              => $groupData[6],
        'estado'             => 1
    ];

    // 调用模型插入数据库
    $this->propuestas_model->register_medida_plan($medida_data);

    // 跳转到下一组起始行
    $startRow += $rowsPerGroup;
}

// 释放资源
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);

关键说明

  1. 指定单元格读取:通过getCell('A1')直接定位目标单元格,无需逐行遍历,解决列跳转问题
  2. 分组循环控制:用startRow标记每组起始位置,每次循环后偏移7行,实现批量分组读取
  3. 空数据判断:通过检查每组首行B列值是否为空,避免无效循环
  4. 日期兼容性处理:如果Excel日期格式非标准,可替换为PhpSpreadsheet内置的日期转换方法:
    // 替换fecha_comprometida的处理逻辑
    $dateCell = $worksheet->getCell("B".($startRow + 5));
    if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($dateCell)) {
        $fecha_comprometida = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($dateCell->getValue())->format('Y-m-d');
    } else {
        $fecha_comprometida = !empty($groupData[5]) ? date('Y-m-d', strtotime($groupData[5])) : null;
    }
    

内容的提问来源于stack exchange,提问作者Nicolas Rudisky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:02:07