使用PHP从Excel文件(xlsx)中提取图像

3

如何使用PHPExcel从Excel文件中读取图片并保存在服务器上并显示它们?文件扩展名为.xlsx。

我的代码:

$objPHPExcel = PHPExcel_IOFactory::load($path);

foreach ($objPHPExcel->getActiveSheet()->getDrawingCollection() as $drawing) {
    if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
        ob_start();
        call_user_func(
            $drawing->getRenderingFunction(),
            $drawing->getImageResource()
        );
        $imageContents = ob_get_contents();

        ob_end_clean();
    }

}

谢谢!


你目前尝试了什么?你可以编辑你的问题让我们看到你的代码。 - lorenzo-s
我复制了我的代码... 你可以在下面看到它。 - rSara
你应该编辑问题本身,添加代码。我已经为您完成了这项工作,请删除您发布的答案以展示您的代码。 - lorenzo-s
1个回答

6
$objPHPExcel->getActiveSheet()->getDrawingCollection()

将返回当前工作表中所有图像对象的ArrayObject。
这些对象将是PHPExcel_Worksheet_Drawing或PHPExcel_Worksheet_MemoryDrawing对象:您可以使用[is_a()]()来识别它们。 然后,您可以使用适用于该类的方法(如API中所述)从文件(对于PHPExcel_Worksheet_Drawing对象)读取图像数据,或直接从PHPExcel_Worksheet_MemoryDrawing对象本身读取。 getName()和getDescription()方法可用于检索图像对象的相关值。
请注意,也可能存在与打印标题相关联的图像对象。
$objPHPExcel->getActiveSheet()->getHeaderFooter()->getImages()

可以用来从页眉/页脚检索图像。这是一个 PHPExcel_Worksheet_HeaderFooterDrawing 对象数组。所有 PHPExcel_Worksheet_Drawing 方法都可以用来从这些对象中提取图像文件。

编辑

开始讲解。

以下代码将从当前活动工作表中提取所有图像,并将它们写入服务器上的文件。

$objPHPExcel = PHPExcel_IOFactory::load($path);

$i = 0;
foreach ($objPHPExcel->getActiveSheet()->getDrawingCollection() as $drawing) {
    if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
        ob_start();
        call_user_func(
            $drawing->getRenderingFunction(),
            $drawing->getImageResource()
        );
        $imageContents = ob_get_contents();
        ob_end_clean();
        switch ($drawing->getMimeType()) {
            case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG :
                    $extension = 'png'; break;
            case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_GIF:
                    $extension = 'gif'; break;
            case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG :
                    $extension = 'jpg'; break;
        }
    } else {
        $zipReader = fopen($drawing->getPath(),'r');
        $imageContents = '';
        while (!feof($zipReader)) {
            $imageContents .= fread($zipReader,1024);
        }
        fclose($zipReader);
        $extension = $drawing->getExtension();
    }
    $myFileName = '00_Image_'.++$i.'.'.$extension;
    file_put_contents($myFileName,$imageContents);
}

文件命名

00_Image_n.extension

其中n是从1开始的数字,而extension则是适用于图像类型的相应扩展名(png,jpg,gif等)。


我已经阅读了这个答案,但是我不理解它... 这是我的代码,但我不知道如何继续,而且它不适用于xls扩展名 $objPHPExcel = PHPExcel_IOFactory::load($path);foreach ($objPHPExcel->getActiveSheet()->getDrawingCollection() as $drawing) { if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { ob_start(); call_user_func( $drawing->getRenderingFunction(), $drawing->getImageResource() ); $imageContents = ob_get_contents(); ob_end_clean(); }} - rSara
你对此不理解的是什么?调用这个函数会返回一个图像对象数组。根据图像对象的类型,你需要使用getImageResource()来获取原始图像数据的字节流,或者使用getIndexedFilename()并读取返回的文件来获取图像。 - Mark Baker
但它不适用于xlsx扩展名。 - rSara
这段代码可以找到并导出所有的图片......但是它们的大小都为0!!有什么想法吗? - Marco Scarnatto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接