我的编程技术记录 Good Luck To You!

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


作者:admin 分类:未分类 浏览:35 评论:0