Добавить картинки к комментариям в PhpSpreadsheet
У меня есть комментарий в PhpSpreadsheet, и я хочу добавить к нему фоновую картинку. Комментарий создается так:
$spreadsheet->getActiveSheet()->getComment($cell)->getText()->createTextRun('Test text');
Но в документации нет ничего о том, как добавить к нему фоновый рисунок.
1 ответ
Я смог решить мою проблему с помощью (плохого, но работающего) обходного пути. Кажется, что PHPSpreadsheet не может (пока) создать фоновую картинку для комментария, возможно, PHPSpreadsheet может сделать это в будущем.
Обходной путь: PHPSpreadsheet не может создать комментарий с backgroundimage, но Powershell это делает. С помощью следующего скрипта Powershell вы добавляете фоновое изображение к комментарию в строке C2 на листе 1.
$excel = new-object -comobject excel.application
$workbook = $excel.workbooks.open("C:\MyExcel.xlsx")
$worksheet = $workbook.worksheets.item(1)
$image = "C:\MyPicture.png"
$worksheet.Range("C2").AddComment(" ")
$worksheet.Range("C2").Comment.Shape.Fill.UserPicture($image)
$workbook.save()
$workbook.close()
Stop-Process -processname powershell*
Обладая этими знаниями, вы можете создавать динамически сценарий Powershell внутри PHP:
$ps_script=Array();
$ps_script[]='$excel = new-object -comobject excel.application';
$ps_script[]='$workbook = $excel.workbooks.open("'.$excel_output_path.'")';
$ps_script[]='$worksheet = $workbook.worksheets.item('.($sheetindex+1).')';
$ps_script[]='$image = "'.$img_path.'"';
$ps_script[]='$worksheet.Range("'.$cell.'").AddComment(" ")';
$ps_script[]='$worksheet.Range("'.$cell.'").Comment.Shape.Fill.UserPicture($image)';
$ps_script[]='$workbook.save()';
$ps_script[]='$workbook.close()';
$ps_script[]='Stop-Process -processname powershell*';
$ps_script = implode("\r\n", $ps_script);
file_put_contents($powershell_output, $ps_script);
Теперь мы создаем сценарий CMD, вызывающий этот сценарий Powershell:
$call_powershell_script=Array();
$call_powershell_script[]="TASKKILL /F /IM powershell.exe";
$call_powershell_script[]="TASKKILL /F /IM EXCEL.exe";
$call_powershell_script[]=$powershell_path.'powershell.exe "'.$powershell_output.'"';
$call_powershell_script[]="TASKKILL /F /IM powershell.exe";
$call_powershell_script[]="TASKKILL /F /IM EXCEL.exe";
$call_powershell_script = implode("\r\n", $call_powershell_script);
file_put_contents($call_powershell_script_path, $call_powershell_script);
И, наконец, мы вызываем этот сценарий CMD внутри PHP:
$output = shell_exec($cpowershell_script_path." 2>&1");
echo "<br>";
echo $output;
echo "<br>";
Примечание. Обычно сценарию Powershell не нужна эта строка:
Stop-Process -processname powershell*
Но без него PHP-скрипт длится вечно.
Примечание 2: я получил сообщение об ошибке в Powershell, когда скрипт запускался PHP, что мой файл Excel был недоступен:
Исключение, вызывающее "Открыть" с аргументом (ами) "1": "Microsoft Office Excel не может получить доступ к файлу" C:\MyExcel.xlsx ". Существует несколько возможных причин: имя файла или путь не существует. используется другой программой. Книга, которую вы пытаетесь сохранить, имеет то же имя, что и текущая открытая книга.
Решение этой ошибки было найдено здесь.