下面由PHP教程栏目给大家介绍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;    }}

更多相关文章

  1. 关于PHP CURL上传二进制流图片
  2. API 交互中怎么做好图片验证码
  3. php+WebUploader图片批量上传
  4. php实现对图片对称加解密(适用身份证加密等场景)
  5. php验证图片不显示

随机推荐

  1. jQuery对象和DOM对象
  2. jquery中的attr和prop深度理解
  3. 在2个不同的Div中播放/淡出声音
  4. 使用AJAX和JSON来显示来自PHP的HTML内容
  5. 删除使用jQuery动态创建的元素
  6. 如何通过CSS或javascript给句子判刑?
  7. 整理:Google jQuery 引用地址大全和方法(转
  8. 如何知道DOM元素何时移动或调整大小
  9. jquery异步机制源码分析
  10. 未捕获的ReferenceError:HTML未在HTMLTabl