Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why am I getting an "invalid or unitialized Zip object" error when trying to read excel file via PHP?

Tags:

phpexcel

I would like to find out how to read an excel file using via PHP. My specific use case is using PHPExcel from within Yii.

I have followed numerous tutorials and I am always stuck at one point: "ZipArchive::getFromName(): Invalid or unitialized Zip object". I have added the extensions, loader, etc. but nothing seems to be working. is there any way around this? or do I need to get another library? Here is the code in my controller.

Yii::import('application.vendors.PHPExcel.PHPExcel',true);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load('c:\cctv.xls'); //$file --> your filepath and filename
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow(); // e.g. 10
$highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5
echo '<table>' . "\n";
for ($row = 2; $row <= $highestRow; ++$row) {
  echo '<tr>' . "\n";
  for ($col = 0; $col <= $highestColumnIndex; ++$col) {
    echo '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>' . "\n";
  }
  echo '</tr>' . "\n";
}
echo '</table>' . "\n";

this is the detailed error:

C:\wamp\www\example\protected\vendors\PHPExcel\PHPExcel\Reader\Excel2007.php(272)

}
 public function _getFromZipArchive(ZipArchive $archive, $fileName = '')
 {
     // Root-relative paths
     if (strpos($fileName, '//') !== false)
     {
         $fileName = substr($fileName, strpos($fileName, '//') + 1);
     }
     $fileName = PHPExcel_Shared_File::realpath($fileName);

     // Apache POI fixes
     $contents = $archive->getFromName($fileName);
     if ($contents === false)
     {
         $contents = $archive->getFromName(substr($fileName, 1));
     }

     /*
     if (strpos($contents, '<?xml') !== false && strpos($contents, '<?xml') !== 0)
     {
         $contents = substr($contents, strpos($contents, '<?xml'));
     }
     var_dump($fileName);
     var_dump($contents);

Stack Trace C:\wamp\www\trunk\protected\vendors\PHPExcel\PHPExcel\Reader\Excel2007.php(272): ZipArchive->getFromName("_rels/.rels")

$fileName = substr($fileName, strpos($fileName, '//') + 1);
}
$fileName = PHPExcel_Shared_File::realpath($fileName);
// Apache POI fixes
$contents = $archive->getFromName($fileName);
if ($contents === false)
{
    $contents = $archive->getFromName(substr($fileName, 1));
}

C:\wamp\www\example\protected\vendors\PHPExcel\PHPExcel\Reader\Excel2007.php(312): PHPExcel_Reader_Excel2007->_getFromZipArchive(ZipArchive, "_rels/.rels")

$excel->removeCellXfByIndex(0); // remove the default style
     }
     $zip = new ZipArchive;
     $zip->open($pFilename);

     $rels = simplexml_load_string($this->_getFromZipArchive($zip, "_rels/.rels")); //~http://schemas.openxmlformats.org/package/2006/relationships");
     foreach ($rels->Relationship as $rel) {
         switch ($rel["Type"]) {
             case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties":
                 $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
                 if (is_object($xmlCore)) {

C:\wamp\www\example\protected\controllers\AdminController.php(58): PHPExcel_Reader_Excel2007->load("c:\cctv.xls")

public function actionCreateSource() {
Yii::import('application.vendors.PHPExcel.PHPExcel',true);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load('c:\cctv.xls'); //$file --> your filepath and filename
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow(); // e.g. 10
$highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5
echo '<table>' . "\n";
like image 810
rodrigue Avatar asked Jan 09 '13 06:01

rodrigue


1 Answers

It looks like you set PHPExcel to explicitly use the 2007 format, but you're trying to open an XLS file. While I'm not 100% sure, I'm going to guess the zip error is because it's trying to unzip the XLS file, and that's going to fail as it's not zipped.

The php zip extension appears to be working, as the error is from the extension - Invalid or unitialized Zip object. My guess is that you're getting an invalid Zip object since you're not dealing with a zip file.

If you're trying to open an XLS file, you probably want:

$objReader = PHPExcel_IOFactory::createReader('Excel5');

Alternatively, you could remove the explicit mode, and just rely upon the automatic file type resolution, e.g.:

$objPHPExcel = PHPExcel_IOFactory::load("c:\cctv.xls");  // Remove the createReader line before this
like image 150
ernie Avatar answered Oct 05 '22 21:10

ernie