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";
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