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

问题描述 投票:3回答:2

如何使用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();
    }

}

谢谢!

php phpexcel
2个回答
5
投票
$objPHPExcel->getActiveSheet()->getDrawingCollection()

将返回活动工作表中所有图像对象的ArrayObject。

这些对象将是PHPExcel_Worksheet_Drawing或PHPExcel_Worksheet_MemoryDrawing对象:您可以使用[is_a()] [1]来识别哪个对象。然后,您可以使用适合该类的方法(如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开始的数字,扩展名是图像类型的适当扩展名(png,jpg,gif等)。


0
投票

您好,迟到的答案,但我认为是有用的!。

[我看过Reading Images from a worksheet的示例,它工作正常,但是我为下面的项目需求定制了相同的示例,例如波纹管。

require 'vendor/autoload.php';

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("./excel.xlsx");

$worksheet = $spreadsheet->getActiveSheet();
$worksheetArray = $worksheet->toArray();
array_shift($worksheetArray);

echo '<table style="width:100%"  border="1">';
echo '<tr align="center">';
echo '<td>Sno</td>';
echo '<td>Name</td>';
echo '<td>Image</td>';
echo '</tr>';

foreach ($worksheetArray as $key => $value) {

    $worksheet = $spreadsheet->getActiveSheet();
    $drawing = $worksheet->getDrawingCollection()[$key];

    $zipReader = fopen($drawing->getPath(), 'r');
    $imageContents = '';
    while (!feof($zipReader)) {
        $imageContents .= fread($zipReader, 1024);
    }
    fclose($zipReader);
    $extension = $drawing->getExtension();

    echo '<tr align="center">';
    echo '<td>' . $value[0] . '</td>';
    echo '<td>' . $value[1] . '</td>';
    echo '<td><img  height="150px" width="150px"   src="data:image/jpeg;base64,' . base64_encode($imageContents) . '"/></td>';
    echo '</tr>';
}

输出:enter image description here

我创建了GitHub高级项目“ phpspreadsheet-Reading-Images-from-Excel文件”,以供将来参考。

Github链接:https://github.com/rajaramtt/phpspreadsheet-Reading-Images-from-an-Excel-File

© www.soinside.com 2019 - 2024. All rights reserved.