是否可以交换现有模板文件中的图像?
在我的excel xlsx模板文件中有三个图像。每个图像都有其自己唯一的名称/标题(IE:"imageBanner_1"(。每个图像都位于工作表上某些图表的参考位置,但不一定绑定到特定的单元格。
在使用图像名称的基础上,是否可以用另一个图像替换图像,使新图像与原始图像位于同一位置,并保留所有原始图像属性(阴影、宽度/长度、名称等(?
这是我尝试过但没有奏效的方法:
$fImages = $speadsheet->getSheetByName("Chart Data")->getDrawingCollection();
foreach ($fImages as $fImage) {
echo "n".$fImage->getName() ;
if ($fImage->getName() == "imageBanner_1") {
$fImage->setPath("path/to/new/file/fileName.png") ;
}
}
如何获取$fImage
的所有属性?也许其中一个是imageBanner_1
上匹配的正确名称
在我的excel模板中,我已将名称(在公式->名称管理器中(绑定为:
Name Value Refers To
imageBanner_1 Picture 9 =*Picture 9*
imageBanner_2 Picture 18 =*Picture 18*
imageBanner_3 Picture 21 =*Picture 21*
进行echo
打印:
Picture 9
Picture 18
Picture 21
这告诉我getName()
要么是对值的引用,要么getName()
实际上是Picture X
。无论哪种方式,我如何使用imageBanner_X
名称作为标识符?我不知道用setPath
简单地替换图像的代码是否有效,因为至少目前由于getName()
的问题,我实际上无法访问图像。
==========更新======
好吧,如果我改变,我上面的代码就可以工作了:
if ($fImage->getName() == "imageBanner_1") {
至
if ($fImage->getName() == "Picture 13") {
但问题是,我必须知道我要替换的确切图片编号。这并不理想,因为图片编号并非总是静态编号。在某些情况下,我正在复制图表或图像,在其他情况下我正在替换。。。尤其是当涉及到复制时,每次我用不同的数据集运行脚本时,要知道确切的图片编号将是一件非常困难的事情。
嗯,这花了一些时间,但我终于完成了。
$mainTempName = "$baseDir/reports/MainReportTemplate.xlsx" ;
$mainTempReader = PhpOfficePhpSpreadsheetIOFactory::createReader("Xlsx") ;
$mainTempFile = $mainTempReader->load($mainTempName, PhpOfficePhpSpreadsheetReaderIReader::LOAD_WITH_CHARTS) ;
$mainTempFile = swapImage($mainTempFile,$localFilePath,$excelImageName,$localFileName) ;
function swapImage($inFile,$iPath,$iName,$iFile) {
foreach ($inFile->getDefinedNames() as $name) {
if ($name->getName() == $iName) {
$picID = str_replace(""","",$name->getValue()) ;
}
}
foreach ($inFile->getSheetByName("Chart Data")->getDrawingCollection() as $fImage) {
if ($fImage->getName() == $picID) {
$fImage->setPath($iPath.$iFile) ;
}
}
return $inFile ;
}
$name->getValue((以引号"Picture 9"
输出值,因此需要使用str_replace来去掉"
s,因为$fImage->getName()
的值没有引号。