最近的 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 表格中插入的图片需要是浮动式的,嵌入式的图片也会无法读取,需注意。