PhpSpreadsheet 读取 excel 中图片信息

112 阅读1分钟

最近的 PHP 项目中需要使用到 excel导入信息功能,里面包含了图片信息需要读取。 所在网上找了一些 PhpSpreadsheet 获取图片使用方法,发现都有点复杂,所以自己又整理了一遍,故成文加深印象。

use PhpOffice\PhpSpreadsheet\IOFactory;

function test_read_image_form_excel()
{
    $reader = IOFactory::createReader('Xlsx');
    // $reader->setReadDataOnly(TRUE); 这里不能打开,否则会变成只读模式,无法获取对应的图片信息。
    $filename = dirname(__FILE__) . '/demo.xlsx'; // demo 为你需要测试表格
    $spreadsheet = $reader->load($filename);
    $worksheet = $spreadsheet->getActiveSheet();
    $highestRow = $worksheet->getHighestRow(); // 总行数
    $lines = $highestRow - 1; // -1 是因为移除表头
    if ($lines <= 0) {
        exit('Excel表格中没有数据');
    }
    foreach ($worksheet->getDrawingCollection() as $drawing) {
        $imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999);
         // 这个文件目录需要提前存在,否则会出错
        $imageFilePath = dirname(__FILE__) . '/excel/imgaes/';
        switch ($drawing->getExtension()) {
            case 'jpg':
            case 'jpeg':
                $imageFileName .= '.jpg';
                $source = imagecreatefromjpeg($drawing->getPath());
                imagejpeg($source, $imageFilePath . $imageFileName);
                break;
            case 'gif':
                $imageFileName .= '.gif';
                $source = imagecreatefromgif($drawing->getPath());
                imagegif($source, $imageFilePath . $imageFileName);
                break;
            case 'png':
                $imageFileName .= '.png';
                $source = imagecreatefrompng($drawing->getPath());
                imagepng($source, $imageFilePath . $imageFileName);
                break;
        }
        // 根据图片所在坐标修改 excel图片值 以便后续进行处理 
        $worksheet->setCellValue($drawing->getCoordinates(), $imageFilePath . $imageFileName);
    }
    // 表格从第二列开始循环所以 $row = 2
    for ($row = 2; $row <= $highestRow; $row++) {
        // 假设图片在第一行 A2 的位置
        $image = $worksheet->getCell([1, $row])->getValue();
        // 这里打印一下
        var_dump($iamge) 
    }
}

疑惑的点???

1、之前因为是只读的情况,也就是 $reader->setReadDataOnly(TRUE); 这一行没有注释掉,我说怎么一直获取的都是空的 ArrayObject,以后需要吸取教训了,真是大头虾。

2、Excel 表格中插入的图片需要是浮动式的,嵌入式的图片也会无法读取,需注意。