PhpSpreadsheet解析Excel文件
安装 PhpSpreadsheet
通过 Composer 安装了 PhpSpreadsheet:
composer require phpoffice/phpspreadsheet
控制器
ExcelController
<?phpnamespace app\controller;use think\facade\Db;
use think\facade\Request;
use think\facade\View;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;class ExcelController
{public function upload(){// 获取上传的文件$file = Request::file('file');if (!$file) {return json(['status' => 'fail', 'message' => 'No file uploaded']);}/* 验证文件类型和大小$validate = ['size' => 10485760, // 10MB'ext' => 'xls,xlsx',];$fileInfo = $file->validate($validate);if (!$fileInfo) {return json(['status' => 'fail', 'message' => $file->getError()]);}*/// thinkphp6验证文件类型和大小$validate = Validate::rule(['file' => 'file|fileExt:xls,xlsx|fileSize:10485760', // 10MB]);$data = ['file' => $file];if (!$validate->check($data)) {return json(['status' => 'fail', 'message' => $validate->getError()]);}// 将文件保存到临时路径$savePath = $file->getPathname();try {// 解析Excel文件$spreadsheet = IOFactory::load($savePath);$sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);// 开启数据库事务Db::startTrans();try {// 批量插入数据到数据库foreach ($sheetData as $index => $row) {if ($index == 0) {// 跳过第一行标题行continue;}// 假设有三列需要插入到数据库Db::table('your_table_name')->insert(['column1' => $row['A'],'column2' => $row['B'],'column3' => $row['C'],]);}// 提交事务Db::commit();return json(['status' => 'success', 'message' => 'Data imported successfully']);} catch (\Exception $e) {// 回滚事务Db::rollback();return json(['status' => 'fail', 'message' => 'Data import failed: ' . $e->getMessage()]);}} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {return json(['status' => 'fail', 'message' => 'Error reading file: ' . $e->getMessage()]);}}
}
路由配置
use think\facade\Route;Route::post('upload-excel', 'ExcelController/upload');
前端
<form action="/upload-excel" method="post" enctype="multipart/form-data"><label for="file">选择 Excel 文件:</label><input type="file" name="file" id="file" accept=".xlsx,.xls"><input type="submit" value="上传并解析">
</form>