php读取Excel里面图片和内容
安装composer 新版office类
composer require phpoffice/phpspreadsheet
和安装
composer require intervention/image 这个类依赖images这个扩展imagemagick用来写入压缩图片和生成图片 下面是 使用方法 有参考 这个作者的方法 然后改了一部分.因为他的在我本机无法生成图片 use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use Intervention\Image\ImageManagerStatic as Image; public function POST_addAction() { $imageFilePath = APP_PATH . "/public/uploads/exce/"; //图片本地存储的路径 if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建 mkdir($imageFilePath, 0777, true); } $reader = IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(TRUE); $filePath = APP_PATH . "/public/uploads/1.xlsx"; try { $objSpreadsheet = $reader->load($filePath); $objWorksheet = $objSpreadsheet->getSheet(0); //获取excel所有内容,不包含图片 $data = $objWorksheet->toArray(); // $objWorksheet->getDrawingCollection() 这个方法是获取获取带图片的对象, //然后通过遍历得到每一个图片和所在的行和列 //最后通过覆盖$data的方法写入所有真实图片绝对路径到 data中 foreach ($objWorksheet->getDrawingCollection() as $key => $drawing) { list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates()); $imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999); switch ($drawing->getExtension()) { case 'jpg': case 'jpeg': $imageFileName .= '.jpg'; $source = imagecreatefromjpeg($drawing->getPath()); //得到excel里面图片的地址资源 Image::make($source)->save($imageFilePath . $imageFileName,50); //利用imagemagick扩展生成图片如果太大还可以压缩一下.50代表压缩比率(中等质量) break; case 'gif': $imageFileName .= '.gif'; $source = imagecreatefromgif($drawing->getPath()); Image::make($source)->save($imageFilePath . $imageFileName,50); break; case 'png': $imageFileName .= '.png'; $source = imagecreatefrompng($drawing->getPath()); Image::make($source)->save($imageFilePath . $imageFileName,50); break; } $startColumn = $this->ABC2decimal($startColumn); $data[$startRow - 1][$startColumn] = $imageFilePath . $imageFileName; } dump($data); } catch (\Exception $e) { $this->error($e->getMessage()); } } /** * @param $abc 传入B列 exce的列数 例如:ABCDE的其中一个 * @return float|int 返回所代表的 第几列 A代表第一列 B代表第2列 */ private function ABC2decimal($abc) { $ten = 0; $len = strlen($abc); for ($i = 1; $i <= $len; $i++) { $char = substr($abc, 0 - $i, 1);//反向获取单个字符 $int = ord($char); $ten += ($int - 65) * pow(26, $i - 1); } return $ten; }