thinkphp如何实现数据导入和导出Excel

thinkphp如何实现数据导入和导出Excel
最新回答
风与纸片人

2026-03-13 04:02:04

在ThinkPHP中实现Excel数据的导入和导出,可结合PhpSpreadsheet库完成,其支持多种格式(如XLSX、CSV),兼容ThinkPHP 6、5.1等版本。以下是具体实现步骤及关键代码示例:

一、安装 PhpSpreadsheet

通过Composer安装依赖库:

composer require phpoffice/phpspreadsheet二、导出数据为Excel

以导出用户列表为例,步骤如下:

  1. 创建Spreadsheet对象,设置表头。
  2. 填充数据,遍历数据库查询结果写入单元格。
  3. 输出下载,设置响应头并保存到输出流。

示例代码(控制器中):

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数据到数据库

步骤包括文件上传、读取内容、数据验证及批量插入:

  1. 处理文件上传,保存到服务器临时目录。
  2. 读取Excel内容,使用IOFactory加载文件并转换为数组。
  3. 遍历数据,跳过表头后逐行插入数据库。

示例代码(控制器中):

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);}四、注意事项
  1. 文件路径与权限

    确保上传目录(如public/storage/excels)可写。

    生产环境需清理临时文件,避免磁盘占用。

  2. 数据验证

    导入前验证必填字段、格式(如邮箱、日期)。

    使用ThinkPHP的验证器或手动校验。

  3. 性能优化

    大数据量导入时,建议分批处理(如每次1000条)。

    导出时可设置列宽、样式(如标题加粗、居中):$sheet->getStyle('A1:C1')->getFont()->setBold(true);$sheet->getStyle('A1:C1')->getAlignment()->setHorizontal('center');

  4. 异常处理

    捕获IOException、数据库异常等,返回友好提示。

五、总结

通过PhpSpreadsheet,ThinkPHP可高效实现Excel的导入导出功能。核心步骤包括:

  • 导出:创建对象→填充数据→输出流。
  • 导入:上传文件→读取内容→数据校验→批量插入。

实际开发中需结合业务需求调整数据映射逻辑,并注重安全性与性能优化。