当前位置:首页 > 问答 > 正文

php怎么把excel数据导入数据库,步骤和注意点分享给你看看

行,那我直接把我之前整理过的关于PHP导入Excel数据到数据库的步骤和注意点分享给你看看,这个流程是我根据网上一些常见的教程(比如像W3School、CSDN博客、PHP官方手册里关于文件处理和数据库操作的部分,以及PHPExcel或者PhpSpreadsheet这类库的文档)和实践经验总结出来的。

第一步:准备好环境

在你开始写代码之前,你得确保你的PHP环境里已经安装了处理Excel文件所需要的扩展,现在最常用的是PhpSpreadsheet,它是以前那个很著名的PHPExcel库的现代版,你不能直接用PHP里的fopen去读Excel文件,那会读出一堆乱码,必须靠这种专门的库来解析。

php怎么把excel数据导入数据库,步骤和注意点分享给你看看

怎么安装呢?通常咱们用Composer来管理PHP的依赖包,在你的项目根目录下,打开命令行,执行一句像 composer require phpoffice/phpspreadsheet 这样的命令,它就会自动下载这个库和它依赖的其他东西,装好之后,你在你的PHP文件里用 require 'vendor/autoload.php'; 引入自动加载文件,就能使用PhpSpreadsheet的类了。

第二步:做一个上传文件的页面(表单)

php怎么把excel数据导入数据库,步骤和注意点分享给你看看

你得有个入口,让用户能把Excel文件传上来,这个简单,就是一个普通的HTML表单,记得要把 enctype 设置成 multipart/form-data,不然文件内容传不过来。

<form action="import.php" method="post" enctype="multipart/form-data">
    选择Excel文件:<input type="file" name="excel_file">
    <input type="submit" value="导入">
</form>

第三步:写处理上传文件的PHP脚本(比如叫import.php)

php怎么把excel数据导入数据库,步骤和注意点分享给你看看

这个脚本是重头戏,它要干好几件事:

  1. 检查文件上传是否成功:先看看有没有上传错误码($_FILES['excel_file']['error']),不是UPLOAD_ERR_OK就说明出问题了,比如文件太大、文件只有一部分上传了等等,要根据错误码给用户个提示。
  2. 检查文件类型:虽然前端可以限制,但后端一定要再检查一遍,防止有人传个假的后缀名过来捣乱,可以检查文件的MIME类型($_FILES['excel_file']['type']),或者更靠谱点,看文件扩展名,Excel文件常见的是.xlsx,老一点的是.xls。
  3. 把上传的临时文件加载到PhpSpreadsheet里:用PhpSpreadsheet的IOFactory类的load方法,把临时文件的路径($_FILES['excel_file']['tmp_name'])传给它,它就会返回一个spreadsheet对象。
  4. 获取活动工作表:一个Excel文件里可能有多个工作表(sheet),通常咱们默认处理第一个或者叫“Sheet1”的那个,用 $spreadsheet->getActiveSheet() 就能拿到。
  5. 遍历每一行数据:拿到工作表后,你可以用 toArray() 方法把整个表变成一个大数组,或者用循环 getRowIterator() 来一行行地读,数组下标是从0开始的,注意Excel表第一行往往是标题行,你可能需要跳过。
  6. 连接数据库:用PDO或者mysqli扩展连上你的MySQL或其他数据库,强烈建议用PDO,因为它支持多种数据库,而且用参数绑定能有效防止SQL注入攻击。
  7. 处理数据并插入数据库
    • 遍历每一行,把每一列的数据提取出来,比如A列是姓名,B列是年龄。
    • 非常重要的一点: 对提取出来的数据,一定要先过滤和验证,比如去掉空格,检查邮箱格式对不对,年龄是不是数字等等,不能直接把用户Excel里的数据插到数据库里,太危险了。
    • 使用预处理语句(prepared statements)来执行INSERT操作,不要用字符串拼接SQL语句!这是防止SQL注入的命根子。$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");,然后循环里 $stmt->execute([$name, $age]);

第四步:处理完成后的反馈

所有数据都插完之后,要给用户一个明确的提示,成功导入XX条数据”,如果中间某一行数据格式不对,最好能记录下来,告诉用户是哪一行出了问题,方便他修改。

一些特别要注意的点(坑):

  1. 内存消耗大:PhpSpreadsheet在处理比较大的Excel文件时,很占内存,如果文件好几兆甚至几十兆,可能会把PHP的内存限制撑爆,报一个“Allowed memory size exhausted”的错误,解决办法有几个:一是在php.ini里调大 memory_limit;二是用PhpSpreadsheet提供的“chunk reading”方式,IOFactory::createReader('Xlsx')->setReadDataOnly(true)->setReadFilter($filter) 来只读数据不读样式,或者分块读取,这样能省很多内存。
  2. 超时问题:导入数据如果很多,PHP脚本可能执行时间会超过30秒的默认限制,然后就被中断了,你需要在脚本开头用 set_time_limit(0) 来设置不限制执行时间,或者设一个足够长的时间。
  3. 数据清洗是关键:用户Excel里的数据可能是五花八门的,比如日期格式,Excel内部可能存的是数字,PhpSpreadsheet读出来可能是浮点数,你需要用 \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp() 这样的方法转成时间戳,数字可能混有空格、逗号,文本可能有多余的空格,这些都要在处理前用 trim() 等函数清理干净。
  4. 事务处理:为了保证数据的一致性,最好把整个插入操作放在一个数据库事务里,万一中间某一行出错了(比如主键重复),你可以回滚(rollback)整个操作,避免数据库里只插进去一半数据,造成脏数据,用PDO的话,beginTransaction(),循环插入,commit(),出错时catch住异常,然后rollback。
  5. 字符编码:如果Excel文件是用中文或者其他非英文字符保存的,要确保PhpSpreadsheet读出来的字符串编码和你数据库的编码一致(一般都是UTF-8),如果不一致,需要用 iconvmb_convert_encoding 函数转码,否则插进数据库会是乱码。
  6. 安全性:再次强调,文件类型检查、数据验证、SQL预处理语句,这几道安全防线一个都不能少,特别是你允许用户上传文件,如果检查不严,风险很高。

基本上,按这个流程走,再把注意点都考虑到,自己动手试几次,就能把Excel导入数据库的功能做得比较稳妥了,希望这些直接的经验总结对你有帮助。