2026-03-13 04:02:04
在ThinkPHP中实现Excel数据的导入和导出,可结合PhpSpreadsheet库完成,其支持多种格式(如XLSX、CSV),兼容ThinkPHP 6、5.1等版本。以下是具体实现步骤及关键代码示例:
一、安装 PhpSpreadsheet通过Composer安装依赖库:
composer require phpoffice/phpspreadsheet二、导出数据为Excel以导出用户列表为例,步骤如下:
示例代码(控制器中):
use PhpOfficePhpSpreadsheetSpreadsheet;use PhpOfficePhpSpreadsheetWriterXlsx;use appmodelUser; // 假设存在User模型public function exportUsers() { // 查询数据 $users = User::select(); // 创建Spreadsheet对象 $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // 设置表头 $sheet->setCellValue('A1', 'ID'); $sheet->setCellValue('B1', '姓名'); $sheet->setCellValue('C1', '邮箱'); // 填充数据(从第2行开始) $row = 2; foreach ($users as $user) { $sheet->setCellValue('A' . $row, $user->id); $sheet->setCellValue('B' . $row, $user->name); $sheet->setCellValue('C' . $row, $user->email); $row++; } // 设置下载响应头 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="users.xlsx"'); header('Cache-Control: max-age=0'); // 输出文件 $writer = new Xlsx($spreadsheet); $writer->save('php://output'); exit;}三、导入Excel数据到数据库步骤包括文件上传、读取内容、数据验证及批量插入:
示例代码(控制器中):
use PhpOfficePhpSpreadsheetIOFactory;use appmodelUser;// 导入方法(接收文件路径)public function importUsers($filePath) { // 加载Excel文件 $spreadsheet = IOFactory::load($filePath); $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); // 遍历数据(跳过表头) foreach ($sheetData as $index => $row) { if ($index == 1) continue; // 忽略第一行表头 // 数据验证(示例:邮箱格式) if (!filter_var($row['C'], FILTER_VALIDATE_EMAIL)) { continue; // 跳过无效数据 } // 准备插入数据 $data = [ 'name' => $row['B'], 'email' => $row['C'], ]; // 插入数据库(假设使用模型创建) User::create($data); } return json(['msg' => '导入成功']);}// 文件上传处理public function upload() { $file = request()->file('excel_file'); if (!$file) { return json(['msg' => '未上传文件']); } // 保存文件到public/storage/excels目录(使用MD5文件名避免冲突) $savename = thinkfacadeFilesystem::disk('public')->putFile('excels', $file, 'md5'); $filePath = thinkfacadeApp::getRootPath() . 'public/storage/' . $savename; // 调用导入方法 return $this->importUsers($filePath);}四、注意事项文件路径与权限
确保上传目录(如public/storage/excels)可写。
生产环境需清理临时文件,避免磁盘占用。
数据验证
导入前验证必填字段、格式(如邮箱、日期)。
使用ThinkPHP的验证器或手动校验。
性能优化
大数据量导入时,建议分批处理(如每次1000条)。
导出时可设置列宽、样式(如标题加粗、居中):$sheet->getStyle('A1:C1')->getFont()->setBold(true);$sheet->getStyle('A1:C1')->getAlignment()->setHorizontal('center');
异常处理
捕获IOException、数据库异常等,返回友好提示。
通过PhpSpreadsheet,ThinkPHP可高效实现Excel的导入导出功能。核心步骤包括:
实际开发中需结合业务需求调整数据映射逻辑,并注重安全性与性能优化。