ThinkPHP项目需实现Excel上传前的数据预览功能,须安装phpoffice/phpspreadsheet扩展,控制器中通过IOFactory加载文件并限制读取前10行生成二维数组,前端用表单或Ajax提交,后端校验文件类型并处理中文乱码、空单元格及合并单元格问题。

ThinkPHP项目中需要用户上传Excel文件前先看到数据预览,避免误传格式错误或内容异常的表格导致后续处理失败。
准备PHPExcel或PhpSpreadsheet扩展
确认项目已安装phpoffice/phpspreadsheet(推荐)或phpexcel(旧版)。Composer命令为composer require phpoffice/phpspreadsheet。若使用TP6+,需确保autoload能识别PhpOffice\PhpSpreadsheet\*命名空间。
未安装该扩展会导致Class 'PhpOffice\PhpSpreadsheet\IOFactory' not found报错,无法读取Excel文件。
创建上传与预览控制器方法
在控制器中新增previewImport方法,接收file表单字段。
立即学习“PHP免费学习笔记(深入)”;
用$_FILES['file']['tmp_name']获取临时路径→调用IOFactory::load()加载工作簿→获取第一个工作表→遍历前10行生成二维数组。
注意:必须限制读取行数,否则大文件(如5万行)会卡死或超内存。这里只取$worksheet->getRowIterator(1, 10)。
前端上传表单与预览渲染
HTML表单需设置enctype="multipart/form-data",并添加onchange="previewExcel(this)"触发JS。
方法一:纯表单提交后跳转到预览页
接收控制器返回的$data(前10行数组)→用foreach循环输出<table>,每列用htmlspecialchars()转义防止XSS。
方法二:Ajax上传+JSON返回
用FormData携带文件→fetch提交→后端返回['status'=>1,'data'=>$rows]→JS动态拼接<tbody>插入表格。
【关键前提】后端必须校验文件后缀为xlsx或xls,且mime_type匹配,否则恶意用户可上传PHP文件绕过。
处理中文列头与空单元格
第一步:调用$cell->getValue()时,对结果做is_null()判断,空值统一转为空字符串,避免模板中出现NULL字面量。
第二步:读取第一行作为表头时,用trim()去除首尾空白,再用mb_convert_encoding($val, 'UTF-8', 'auto')强制转码,解决GBK编码Excel乱码问题。
第三步:若首行含合并单元格,getCellByColumnAndRow()可能返回空,此时应 fallback 到getMergeCells()解析范围,否则表头错位。



















