当前位置: 首页 > news >正文

ThinkPHP-导入Excel表格(通用版)

一、版本说明

1.PHP8.2、MySQL8.0、ThinkPHP8.0

2.使用前安装phpspreadsheet

composer require phpoffice/phpspreadsheet
二、技术说明

因本人采用前后端分离,因此上传文件以及导入表格为分离开发,如无需分离开发则自行合并开发即可。

1.第一步:上传并验证文件

2.第二步:读取Excel表格数据

3.第三步:存入数据库

三、上传Excel - 核心代码
$file = $this->request->file();
if (empty($file) || !isset($file['file'])) $this->error('请上传文件!');try {//  验证文件大小及后缀validate(['file' => "file|fileSize:$this->excelSize|fileExt:$this->ExcelExt"])->check($file);//  上传文件$saveName = \think\facade\Filesystem::disk('public')->putFile($path, $file['file']);//  上传至OSS ---- 请自行操作return $saveName;    // 返回文件地址
} catch (ValidateException|\Exception $e) {return $e->getMessage();
}
四、导入数据 - 核心代码
/*** @note 导入报名数据*/public function importList(): void{if ($this->request->isPost()) {$file = $this->request->post('file/s', '');if (empty($file)) $this->error('请上传文件!');//  读取选中工作sheet,默认第一张表$selectSheet = $this->request->post('select_sheet/d', 1);if ($selectSheet < 1) $selectSheet = 1;//  读取行数,默认从第二行开始读$readLine = $this->request->post('read_line/d', 2);if ($readLine < 1) $readLine = 2;//  数据插入结果$result = false;//  数据插入总数$resCount = 0;try {//  获取文件地址$saveName = public_path() . 'storage/' . $file;if (!file_exists($saveName)) throw new Exception('文件不存在!');$fileExtendName = substr(strrchr($saveName, '.'), 1);// 有Xls和Xlsx格式两种if ($fileExtendName == 'xlsx') {$objReader = IOFactory::createReader('Xlsx');} else {$objReader = IOFactory::createReader('Xls');}$objReader->setReadDataOnly(TRUE);// 读取文件$objPHPExcel = $objReader->load($saveName);$sheet = $objPHPExcel->getSheet($selectSheet - 1);   //excel中的第一张sheet$highestRow = $sheet->getHighestRow();       // 取得总行数$highestColumn = $sheet->getHighestColumn();   // 取得总列名if ($highestRow < 1) throw new Exception('数据不能为空!');if ($readLine > $highestRow) throw new Exception('数据读取行数据不能大于总行数!');
//   ---------------- 检测列数是否与模板一致,此处逻辑用不到可忽略,START --------------$template = (new RegisterTemplate())->where('activity_id', $activityId)->value('form_label');if (empty($template)) throw new Exception('未找到赛事报名模板!');//  取出列所在的field字段$template = json_decode($template, true);$columnNumber = column_to_number($highestColumn);if ((count($template) + 2) !== $columnNumber) throw new Exception('导入数据列数与模板不一致!');//  找出列对应的field字段$headerField = [];for ($column = 'C'; $column <= $highestColumn; $column++) {$columnTitle = $sheet->getCell($column . '1')->getValue();foreach ($template as $v) {if ($v['title'] === $columnTitle) {$v['key'] = $column;$headerField[] = $v;break;}}}
//   ---------------- 检测列数是否与模板一致,此处逻辑用不到可忽略,END --------------//  循环读取数据$data = [];for ($row = $readLine; $row <= $highestRow; $row++) {$rowData = [];for ($column = 'C'; $column <= $highestColumn; $column++) {// 根据自身实际业务,下方foreach可替换为:$rowData[] = $sheet->getCell($column . $row)->getValue();foreach ($headerField as $val) {if ($val['key'] === $column) {$val['value'] = $sheet->getCell($column . $row)->getValue();$rowData[] = $val;break;}}}$data[] = json_encode($rowData, JSON_UNESCAPED_UNICODE);}//  保存数据$saveData = [];foreach ($data as $v) {$saveData[] = ['activity_id' => $activityId,'org_id' => $orgId,'org_name' => $orgId == 0 ? '' : $org['title'],'forms' => $v,'admin_id' => $this->auth->id,];}$resSave = (new modelSave())->saveAll($saveData);if (empty($resSave)) throw new Exception('数据导入失败!');$resCount = count($resSave);$result = true;} catch (ValidateException|\Exception $e) {$this->error($e->getMessage());}if ($result) {unlink(public_path() . 'storage/' . $file);    // 删除文件$this->success('数据导入成功,共导入' . $resCount . '条数据!');}$this->error('数据导入失败!');}$this->error('request error!');}

http://www.lryc.cn/news/382071.html

相关文章:

  • 毕昇jdk教程
  • 【R语言】地理探测器模拟及分析(Geographical detector)
  • 深入理解Qt属性系统[Q_PROPERTY]
  • 【C语言课程设计】员工信息管理系统
  • 「动态规划」如何求最长递增子序列的长度?
  • 深度神经网络DNN概念科普
  • Tomcat WEB站点部署
  • IPv6 中 MAC 33:33 的由来
  • 告别手动邮件处理:使用imbox库轻松管理你的收件箱
  • Ubuntu 18.04 安装 PCL 1.14.1
  • 公司logo设计大全怎么找?直接帮你设计logo
  • 如何调整C#中数组的大小
  • 通过言语和非言语检索线索描绘睡眠中的记忆再激活茗创科技茗创科技
  • MDPI旗下SSCI最新影响因子目录出炉!“水刊“Sustainability表现如何?
  • Matlab基础篇:数据输入输出
  • MySQL字典数据库设计与实现 ---项目实战
  • python数据分析——数据预处理
  • 【Python】使用matplotlib绘制图形(曲线图、条形图、饼图等)
  • vue下载本地xls模版静态文件
  • 手机开热点,里面的WPA2-Personal和WPA3-Personal的区别
  • 算法课程笔记——点积叉积
  • 详解 | DigiCert EV代码签名证书
  • pdf压缩大小,PDF压缩大小不影响清晰度
  • 项目管理必备工具:2024年十大软件排行榜
  • SOLIDWORKS专业版2024价格
  • 【外快业务】百度网盘扫码源码系统部署过程记录。
  • lucene原理
  • 华为、H3C交换机常用巡检命令
  • 网络安全 DVWA通关指南 SQL Injection(SQL注入)
  • 【Linux】版本