PHPExcel – ошибка при попытке вставить изображение после загрузки и записи

Я видел эту проблему во многих сообщениях. но никто не ответил. первый раз, когда я вставляю изображение в файл excel, проблем нет. Но если я снова загружу этот файл excel и попытаюсь вставить другое изображение в другую ячейку, возникает следующая проблема:

Fatal error: Uncaught exception 'PHPExcel_Writer_Exception' with message 'File zip://C:\xampp\htdocs\Well\test.xlsx#xl/media/well1.bmp does not exist' in C:\xampp\htdocs\Well\Classes\PHPExcel\Writer\Excel2007\ContentTypes.php:242 Stack trace: #0 C:\xampp\htdocs\Well\Classes\PHPExcel\Writer\Excel2007\ContentTypes.php(181): PHPExcel_Writer_Excel2007_ContentTypes->_getImageMimeType('zip://C:\xampp\...') #1 C:\xampp\htdocs\Well\Classes\PHPExcel\Writer\Excel2007.php(246): PHPExcel_Writer_Excel2007_ContentTypes->writeContentTypes(Object(PHPExcel), false) #2 C:\xampp\htdocs\Well\test.php(125): PHPExcel_Writer_Excel2007->save('test.xlsx') #3 {main} thrown in C:\xampp\htdocs\Well\Classes\PHPExcel\Writer\Excel2007\ContentTypes.php on line 242. 

Это мой код для рисования:

 `$objDrawing = new PHPExcel_Worksheet_Drawing(); $objDrawing->setName('image'); $objDrawing->setDescription('nnnnn'); $objDrawing->setPath('images/well.bmp'); $objDrawing->setCoordinates('I'.$s); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());` 

Я искал много, и я видел несколько сообщений об этом. но никто из них не ответил.

Изменить: Мой код:

 require_once 'Classes/PHPExcel.php'; require_once 'Classes/PHPExcel/IOFactory.php'; $name='statistics.xlsx'; if(file_exists($name)) { $objPHPExcel = PHPExcel_IOFactory::load($name); $lastRow = $objPHPExcel->getActiveSheet()->getHighestRow(); $j=$lastRow+10; } else { $j=1; $objPHPExcel = new PHPExcel(); } $i='A'; $objPHPExcel->setActiveSheetIndex(0); // I am not writing the entire data $objPHPExcel->getActiveSheet()->setCellValue($i++.$j, 'name'); $objDrawing = new PHPExcel_Worksheet_Drawing(); $objDrawing->setName('image'); $objDrawing->setDescription('image'); $objDrawing->setPath('image.png'); $objDrawing->setCoordinates('E'.$s); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save($name); 

Я думаю, что это ошибка в PHPExcel в Classes\PHPExcel\Writer\Excel2007.php . Его легко исправить.

Короткий ответ: комментарий или удаление строк 235-237. Это будет этот код:

  if (file_exists($pFilename)) { unlink($pFilename); } 

Тогда ваш код будет работать. Я проверил, теперь это работает для меня.

Теперь, какое-то более длинное объяснение. В строках 235-243 есть этот код:

  if (file_exists($pFilename)) { unlink($pFilename); } // Try opening the ZIP file if ($objZip->open($pFilename, $zipOverWrite) !== true) { if ($objZip->open($pFilename, $zipCreate) !== true) { throw new PHPExcel_Writer_Exception("Could not open " . $pFilename . " for writing."); } } 

Теперь в этом коде три вещи имеют место в порядке:

  1. Если мы сохраняем данные в существующий файл, то этот файл будет удален ( unlink )
  2. Если мы сохраняем данные в существующий файл, перезапишите этот файл
  3. Если мы сохраняем данные в несуществующий файл, создайте его

Как вы видите, операция с шага 2 никогда не выполняется, поскольку в шаге 1 файл всегда удаляется. И в этом процессе все ранее существующие вложения файлов теряются. Вот почему позже вы получаете ошибку. File XXX does not exist Действительно, ваши предыдущие файлы изображений не присутствуют во вновь создаваемом файле.

Очевидным решением этой проблемы является удаление шага 1. Если файл существует, он должен быть перезаписан. Я не вижу логического объяснения для шага 1. Может быть, это осталось от старого кода.