PHPExcel - 在加载和写入后尝试插入图像时出错

时间:2014-05-25 11:57:49

标签: php image append 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);

1 个答案:

答案 0 :(得分:8)

我认为这是Classes\PHPExcel\Writer\Excel2007.php中PHPExcel中的一个错误。它易于修复。

简短回答是:注释掉或删除第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. 如果我们要将数据保存到不存在的文件,请创建
  4. 如您所见,从未执行步骤2中的操作,因为在步骤1中文件始终已删除。在此过程中,所有以前存在的文件附件都将丢失。这就是为什么以后你会收到错误File XXX does not exist - 实际上,你早期的图像文件不存在于新创建的文件中。

    这个问题的明显解决方法是删除第1步。如果文件存在,则应该覆盖它。我没有看到第1步的任何合理解释。也许它是旧的代码遗留下来的。