在處理 Excel 匯入功能時,有時需要判斷上傳的試算表中是否包含圖片(如簽名圖、商品照片等)。PHPExcel 庫提供了 getDrawingCollection() 方法,可輕鬆取得工作表中的所有繪圖物件。
<?php
require_once 'PHPExcel/IOFactory.php';
$excelPath = 'Test.xls';
// 建立 Excel5 讀取器(適用 .xls 格式)
$objReader = PHPExcel_IOFactory::createReader('Excel5');
// 僅讀取資料,不載入格式樣式,提升效能
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($excelPath);
$currentSheet = $objPHPExcel->getActiveSheet();
// 取得該工作表的所有繪圖集合
$allImages = $currentSheet->getDrawingCollection();
if (count($allImages) > 0) {
echo "偵測到圖片,共 " . count($allImages) . " 張";
// 後續處理:遍歷 $allImages 取得圖片路徑、座標、尺寸等
foreach ($allImages as $drawing) {
if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
$path = $drawing->getPath(); // 圖片路徑或 URL
$coordinate = $drawing->getCoordinate(); // 所在儲存格(如 A1)
$width = $drawing->getWidth();
$height = $drawing->getHeight();
// 進行圖片下載、儲存、關聯資料等邏輯
}
// 若為 MemoryDrawing(記憶體圖片),需用 getImageResource() 取得 GD 資源
}
} else {
echo "此工作表不包含圖片";
}
Excel5 讀取 .xls;Excel2007 讀取 .xlsx。實務上建議根據副檔名動態選擇 Reader。setReadDataOnly(true) 可大幅減少記憶體佔用,但若需處理圖片,必須設為 false(預設值),否則 getDrawingCollection() 會回傳空集合。PHPExcel 改為 PhpOffice\PhpSpreadsheet。掌握 getDrawingCollection() 的用法,能讓 Excel 匯入功能更完整、更貼近實務需求。