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

php 实现 导入excel 带图片导入

    public function import(){$file = explode('.', $_FILES['file']['name']);if (!in_array(end($file), array('xls', 'xlsx', 'csv'))) {return $this->ajaxReturn($this->errorCode,'请选择xls文件');}$path = $_FILES['file']['tmp_name'];if (empty($path)) {return $this->ajaxReturn($this->errorCode,'文件上传失败');}set_time_limit(0);$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($path);$sheet = $spreadsheet->getActiveSheet(1);// 1. 收集图片$imgMap = []; // 行号 => [图片路径...]$saveDir = __DIR__ . '/uploads/excel/';if (!is_dir($saveDir)) {mkdir($saveDir, 0777, true);}$drawings = $sheet->getDrawingCollection();foreach ($sheet->getDrawingCollection() as $drawing) {$coordinate = $drawing->getCoordinates(); // e.g. B2preg_match('/([A-Z]+)(\d+)/', $coordinate, $matches);$col = $matches[1] ?? '';$rowIndex = $matches[2] ?? 0;$filename = uniqid('excel_');if ($drawing instanceof \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing) {ob_start();call_user_func($drawing->getRenderingFunction(),$drawing->getImageResource());$imageContents = ob_get_contents();ob_end_clean();$extension = ($drawing->getMimeType() == \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG) ? 'png' : 'jpg';$fullpath = $saveDir . $filename . '.' . $extension;file_put_contents($fullpath, $imageContents);} else {$zipPath = $drawing->getPath();$extension = pathinfo($zipPath, PATHINFO_EXTENSION);$fullpath = $saveDir . $filename . '.' . $extension;copy($zipPath, $fullpath);}// 只存 B 列的图if ($col === 'B') {$imgMap[$rowIndex][] = '/uploads/excel/' . basename($fullpath);}}// 2. 读取表格数据$res = [];foreach ($sheet->getRowIterator(2) as $row) { // 从第2行开始,跳过表头$tmp = [];foreach ($row->getCellIterator() as $label => $cell) {$tmp[$label] = trim($cell->getFormattedValue());}if (filterEmptyArray($tmp)) {$res[$row->getRowIndex()] = $tmp;}}// 3. 拼接数据$list = [];foreach ($res as $rowIndex => $item) {$part_no   = $item['A'] ?? '';$part_name = $item['C'] ?? '';$car_model = $item['D'] ?? '';$brand     = $item['E'] ?? '';$stock     = (int)($item['F'] ?? 0);$price     = toPrice($item['G'] ?? 0);// 图片:B列,多张存 JSON$img = isset($imgMap[$rowIndex]) ? implode(',',$imgMap[$rowIndex]) : '';$list[] = ['part_no'    => $part_no,'part_name'  => $part_name,'car_model'  => $car_model,'brand'      => $brand,'stock'      => $stock,'price'      => $price,'img'        => $img,'partner_id' => $this->user_info['partner_id'],'subuser_id' => $this->user_info['subuser_id'],];}dd($list);if (!empty($list)){Db::name('share')->insertAll($list);}return $this->ajaxReturn($this->successCode,'操作成功');}

导入文件的模板在这里插入图片描述

一定要注意,图片一定要是浮动模式

如何设置浮动模式

在这里插入图片描述

最后打印的结果

在这里插入图片描述


文章转载自:

http://TD7XSUa9.rttkL.cn
http://zEjHbNGw.rttkL.cn
http://V7GIXit0.rttkL.cn
http://OJXnvPEF.rttkL.cn
http://5hlxFolQ.rttkL.cn
http://VwgogI1F.rttkL.cn
http://NBuogIIk.rttkL.cn
http://jZoiIhsx.rttkL.cn
http://N3y4o63N.rttkL.cn
http://1nnTE6Jp.rttkL.cn
http://iryLOP2n.rttkL.cn
http://eDN0vOgR.rttkL.cn
http://z61HAyml.rttkL.cn
http://8HgK1QYT.rttkL.cn
http://bXWfb00q.rttkL.cn
http://3ks0Vzrj.rttkL.cn
http://VINoktjH.rttkL.cn
http://RoMEcySl.rttkL.cn
http://nfZTplMK.rttkL.cn
http://pmLsT3Hh.rttkL.cn
http://hympOioq.rttkL.cn
http://ZCPSLllt.rttkL.cn
http://Xq8RysqG.rttkL.cn
http://EtXtZ4r6.rttkL.cn
http://mrdhyOaq.rttkL.cn
http://jY93Co5d.rttkL.cn
http://cOpIwwP0.rttkL.cn
http://8KwqlJ98.rttkL.cn
http://H6OGovUx.rttkL.cn
http://bL6PiTwS.rttkL.cn
http://www.dtcms.com/a/374078.html

相关文章:

  • JP4-7-MyLesson后台前端(五)
  • 【系统分析师】第17章-关键技术:嵌入式系统分析与设计(核心总结)
  • Centos9安装rocketmq
  • Docker | 一种使用 docker-compose 命令将 YAML 定义的配置文件导入到 Docker 的方法
  • 编译器构造:模拟器,汇编与反汇编
  • 自由学习记录(96)
  • Cy5-Tyramide, Cyanine 5 Tyramide;1431148-26-3
  • JMeter接口测试全流程解析
  • ARM处理器的小常识
  • Go语言极速入门与精要指南从零到精通的系统化学习路径
  • RK3576 android14 usb_audio_policy_configuration.xml解析
  • 本地安装部署svn服务,并设置外网远程访问内网svn,含路由器转发和端口映射工具教程
  • idea2025构建springboot项目能运行的样例
  • 【底层机制】std::unordered_map 扩容机制
  • Cpp::STL—位图bitset的使用与模拟实现(39)
  • 链表 (C/C++)
  • WinEdt编译tex文件失败解决办法
  • C语言第12讲
  • commons-email
  • (堆)347. 前 K 个高频元素
  • GitHub Release Monitor部署指南:实时追踪开源项目更新与自动通知
  • 重新定义音频编程:SoundFlow如何以模块化设计革新.NET音频开发生态
  • SQL 注入与防御-第八章:代码层防御
  • Miniflux 安全升级:绑定域名并开启 HTTPS
  • 标准 HTTP 状态码详解
  • STM32开发(创建工程)
  • MFC 图形设备接口详解:小白从入门到掌握
  • APM32芯得 EP.34 | 告别I2C“假死”——APM32F103硬件IIC防锁死设计
  • n8n入门
  • 静态住宅IP的特点