如何解决如何获取Excel单元格中存在的图像?
我需要阅读单元格中显示的图像,我知道如何阅读图纸中的图纸,但是getDrawingCollection()
仅适用于图纸。是否有任何功能可以在获取数据时提供单元格中存在的图像。以下代码用于获取工作表数据。
$spreadsheet = IOFactory::load($inputFileName);
$worksheet = $spreadsheet->setActiveSheetIndex(2);
foreach ($worksheet->getRowIterator() as $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE);
foreach ($cellIterator as $cell) {
echo $cell->getValue();
}
}
如果问题是重复的,我很乐意将其删除。
解决方法
我认为它没有任何功能,但是您可以执行以下操作:
foreach ($worksheet->getDrawingCollection() as $drawing) {
$drawings[$drawing->getCoordinates()] = $drawing;
}
// then find your image using your cell coordinates
$image = $drawings[$cell->getCoordinates()];
// or
foreach ($worksheet->getDrawingCollection() as $drawing) {
if($drawing->getCoordinates() == $cell->getCoordinates()){
// or do your stuff here
}
}
,
我怀疑这是PHPSpreadsheet team的蓄意设计决定,因为您不能真的将图像插入Excel的单元格中-您可以将图像锁定在单元格上方(这样当您调整行/列的大小时,图像停留在该单元格上。无论如何,出于您的目的,这是学术性的。
好,所以我们只能在电子表格级别访问图形。幸运的是,我们可以获取图形的坐标..因此,我们可以在此数据之上建立一个索引,以便为您提供所需的访问权限。
class WorksheetDrawingExt {
private array $idx=[];
/**
* Upon construction will build an index drawings and their locations
*/
public function __construct(PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $ws) {
$this->createDrawingIndex($ws);
}
private function addDrawingToCell($coord,$drawing) {
if (array_key_exists($coord,$this->idx)) {
//There's already one image here - append a new
$this->idx[$coord][]=$drawing;
} else {
//No images so far,setup the base array
$this->idx[$coord]=[$drawing];
}
}
private function createDrawingIndex($ws) {
$drawings=$ws->getDrawingCollection();
foreach ($drawings as $drawing) {
$coord=$drawing->getCoordinates();//Inconsistent plural!
$this->addDrawingToCell($coord,$drawing);
}
}
/**
* Get all drawings for a cell (always returns an array even if there's 1 or less images)
*/
public function drawingsForCell(PhpOffice\PhpSpreadsheet\Cell\Cell $cell):array {
return $this->drawingsForCoordinate($cell->getCoordinate());
}
/**
* Get all drawings at the given coordinate (always returns an array even if there's 1 or less images)
*/
public function drawingsForCoordinate(string $coordinate):array {
if (array_key_exists($coordinate,$this->idx)) {
return $this->idx[$coordinate];
} else {
return [];
}
}
}
您需要为您访问的每个工作表创建这些对象之一,然后使用drawingsForCoordinate
或drawingsForCell
是您关心的方法。那么您如何使用它呢?遍历电子表格时,您可以向该对象询问与单元格有关的图形:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$ws = $spreadsheet->getActiveSheet();
//Build the new index of drawings:
$wsExt=new WorksheetDrawingExt($ws);
foreach ($ws->getRowIterator() as $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE);
foreach ($cellIterator as $cell) {
//Report the coord:
$coord=$cell->getCoordinate();
echo $coord.': ';
//Report the content
echo $cell->getValue();
//Report images - our new feature in action
$ds=$wsExt->drawingsForCoordinate($coord);
//$ds=$wsExt->drawingsForCell($cell);
foreach($ds as $d) echo $d->getPath().',';
echo "\n";
}
}
我已经稍微更改了您的代码,以表明我们当前正在使用的单元格坐标。出于显示目的,我输出了绘图路径(仅当它不是\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing
时存在)。您可以使用$wsExt->drawingsForCoordinate($coord);
(活动)或$wsExt->drawingsForCell($cell);
(注释)访问该单元格的所有图形。
因为出于您的目的,您希望访问图形-我选择在WorksheetDrawingExt
创建时创建索引。但是,如果可能不总是使用图形(但始终会构建新类),则最好将索引创建与第一次使用drawingsFor*
绑定在一起-我将其保留为练习读者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。