当前位置 博文首页 > 文章内容

    PHP读取Excel图片对象,并保存替换为相对路径

    作者:shunshunshun18 栏目:未分类 时间:2021-01-14 10:43:21

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    下面由栏目给大家介绍PHP读取Excel图片对象,并保存替换为相对路径方法,希望对需要的朋友有所帮助!

    PHP利用PhpSpreadsheet 和 xlswriter 读取Excel图片对象,保存替换为相对路径

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2021/1/11 0011
     * Time: 8:59
     */
    
    namespace App\Services;
    
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    use PhpOffice\PhpSpreadsheet\Exception;
    use PhpOffice\PhpSpreadsheet\IOFactory;
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
    use Vtiful\Kernel\Excel;
    
    /**
     * 读取Excel图片并保存其路径
     * Class ExcelImagePathServer
     * @package App\Services
     */
    class ExcelImagePathServer
    {
        /**
         * @var string
         */
        protected $relative_path = '/images';
    
        /**
         * @var Spreadsheet
         */
        protected $spreadsheet;
    
        /**
         * @var Excel
         */
        protected $xls_writer;
    
        /**
         * @var Excel
         */
        protected $sheet_writer;
    
        /**
         * @var string
         */
        protected $image_path;
    
        /**
         * ExcelImagePathServer constructor.
         * @param string $excel_file
         * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
         */
        public function __construct($excel_file)
        {
            $reader = IOFactory::createReader('Xlsx');
            $this->spreadsheet = $reader->load($excel_file);
    
            $config = ['path' => dirname($excel_file)];
            $this->xls_writer = new Excel($config);
    
            $this->image_path = dirname($excel_file) . $this->relative_path;
            if (!is_dir($this->image_path)) {
                mkdir($this->image_path, 0755);
            }
        }
    
        /**
         * @throws Exception
         */
        public function handle()
        {
            $write_filename = date('YmdHis') . '.xlsx';
            $sheetCount = $this->spreadsheet->getSheetCount();
            for ($i = 0; $i < $sheetCount; $i++) {
                $worksheet = $this->spreadsheet->getSheet($i);
                $data = $worksheet->toArray();
                $sheetNames = $this->spreadsheet->getSheetNames();
                var_dump($sheetCount, $sheetNames);
                // 读取并修改
                foreach ($worksheet->getDrawingCollection() as $drawing) {
                    /**@var $drawing Drawing* */
                    list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
                    $image_filename = "/{$i}-" . $drawing->getCoordinates();
                    $image_suffix = $this->saveImage($drawing, $image_filename);
                    $image_name = ltrim($this->relative_path, '/') . "{$image_filename}.{$image_suffix}";
                    var_dump($image_name);
                    $startColumn = $this->ABC2decimal($startColumn);
    
                    $data[$startRow - 1][$startColumn] = $image_name;
                }
    
                // 写入文件
                if ($i == 0) {
                    $this->sheet_writer = $this->xls_writer->fileName($write_filename, $sheetNames[$i])->data($data);
                } else {
                    // 向文件中追加工作表
                    $this->sheet_writer->addSheet($sheetNames[$i])->data($data);
                }
            }
            // 最后的最后,输出文件
            $filePath = $this->sheet_writer->output();
            var_dump($filePath);
        }
    
        /**
         * 保存图片
         *
         * @param Drawing $drawing
         * @param $image_filename
         * @return string
         * @throws Exception
         */
        protected function saveImage(Drawing $drawing, $image_filename)
        {
            $image_filename .= '.' . $drawing->getExtension();
            switch ($drawing->getExtension()) {
                case 'jpg':
                case 'jpeg':
                    $source = imagecreatefromjpeg($drawing->getPath());
                    imagejpeg($source, $this->image_path . $image_filename);
                    break;
                case 'gif':
                    $source = imagecreatefromgif($drawing->getPath());
                    imagegif($source, $this->image_path . $image_filename);
                    break;
                case 'png':
                    $source = imagecreatefrompng($drawing->getPath());
                    imagepng($source, $this->image_path . $image_filename);
                    break;
                default:
                    throw new Exception('image format error!');
            }
    
            return $drawing->getExtension();
        }
    
        /**
         * 坐标转换
         *
         * @param $abc
         * @return float|int
         */
        protected 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;
        }
    }