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

Posted

技术标签:

【中文标题】PHPExcel - 加载和写入后尝试插入图像时出错【英文标题】:PHPExcel - error while trying to insert image after loading and writing 【发布时间】:2014-07-14 08:02:03 【问题描述】:

我在很多帖子中都看到了这个问题。但没有人回答。 第一次在 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);

【问题讨论】:

能否请您发布您的整个代码并详细说明如何复制此错误? @Grzegorz...感谢您的回复。我已经包含了整个代码。请检查一下。第一次保存没问题。但是当我第二次尝试时,它显示错误并删除了保存的文件。请仔细查看。 【参考方案1】:

我认为这是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.");
            
        

现在,在这段代码中,三件事按顺序发生:

    如果我们将数据保存到现有文件,则该文件将被删除 (unlink) 如果我们要将数据保存到现有文件,请覆盖此文件 如果我们将数据保存到不存在的文件中,请创建它

如您所见,第 2 步的操作永远不会执行,因为第 1 步中的文件总是被删除。在此过程中,所有先前存在的文件附件都将丢失。这就是为什么稍后您会收到错误 File XXX does not exist - 实际上,您之前的图像文件不存在于新创建的文件中。

解决此问题的明显方法是删除第 1 步。如果文件存在,则应将其覆盖。对于第 1 步,我没有看到任何合乎逻辑的解释。可能是一些旧代码遗留下来的。

【讨论】:

以上是关于PHPExcel - 加载和写入后尝试插入图像时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Thymeleaf 和 Spring Security 项目中插入图像时出现 404 错误

phpexcel写入追加已有的excel文件

尝试下载用户映像时出现Microsoft.Graph.ServiceException

ThinkPHP3.2.3 PHPExcel读取excel插入数据库

phpexcel 合并单元格后插入图片 如何让图片居中

对 JPG 图像进行操作时出现“无法将模式 P 写入 JPEG”