使用 PHP 从 XLSX 中提取图像或图表?
Extract images or charts from XLSX with PHP?
我一直在尝试使用 phpspreadsheet 库从 Xlsx 文件中提取图像和图表;然而我一直没有成功。
的确,我写的这段代码无法从我的 xlsx 文件中找到任何图像或图表。
但是,当我使用 Excel 将文件从 Xlsx 转换为 Xls 时,相同的代码可以正常工作并设法提取图像和图表。
这是我用来加载我的电子表格的代码:
$fileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($filePath);
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($fileType);
$spreadsheet = $reader->load($filePath);
然后我添加了官方文档提供的代码:
$i = 0;
foreach ($spreadsheet->getActiveSheet()->getDrawingCollection() as $drawing) {
if ($drawing instanceof \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing) {
ob_start();
call_user_func(
$drawing->getRenderingFunction(),
$drawing->getImageResource()
);
$imageContents = ob_get_contents();
ob_end_clean();
switch ($drawing->getMimeType()) {
case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG :
$extension = 'png';
break;
case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_GIF:
$extension = 'gif';
break;
case \PhpOffice\PhpSpreadsheet\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);
}
以上代码适用于 .xls 文件,但不适用于 .xlsx 文件:getDrawingCollection
and/or getChartCollection
return 包含 .xlsx 文件的空数组。 ..
你们中有人知道如何执行此操作吗?
我愿意接受任何解决方案...即使这意味着通过另一个库转换文件...
提前致谢,
我找到了解决方案...一行代码,在初始化 reader 之后添加:
$reader->setIncludeCharts(true);
我一直在尝试使用 phpspreadsheet 库从 Xlsx 文件中提取图像和图表;然而我一直没有成功。
的确,我写的这段代码无法从我的 xlsx 文件中找到任何图像或图表。
但是,当我使用 Excel 将文件从 Xlsx 转换为 Xls 时,相同的代码可以正常工作并设法提取图像和图表。
这是我用来加载我的电子表格的代码:
$fileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($filePath);
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($fileType);
$spreadsheet = $reader->load($filePath);
然后我添加了官方文档提供的代码:
$i = 0;
foreach ($spreadsheet->getActiveSheet()->getDrawingCollection() as $drawing) {
if ($drawing instanceof \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing) {
ob_start();
call_user_func(
$drawing->getRenderingFunction(),
$drawing->getImageResource()
);
$imageContents = ob_get_contents();
ob_end_clean();
switch ($drawing->getMimeType()) {
case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG :
$extension = 'png';
break;
case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_GIF:
$extension = 'gif';
break;
case \PhpOffice\PhpSpreadsheet\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);
}
以上代码适用于 .xls 文件,但不适用于 .xlsx 文件:getDrawingCollection
and/or getChartCollection
return 包含 .xlsx 文件的空数组。 ..
你们中有人知道如何执行此操作吗? 我愿意接受任何解决方案...即使这意味着通过另一个库转换文件...
提前致谢,
我找到了解决方案...一行代码,在初始化 reader 之后添加:
$reader->setIncludeCharts(true);