• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 3年前 (2022-01-20) 14次浏览 已收录 0个评论

下面由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();
                $im<p>4本文¥来源gao!%daima.com搞$代*!码$网9</p><pre>搞代gaodaima码

age_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;
}
}


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP读取Excel图片对象,并保存替换为相对路径
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址