2

我一直在使用 PHPExcel 读取 Excel 文件,并通过 JSON 编码的数组将活动工作表的内容发送回页面。当我加载特定的 Excel 文件(在本例中为 cookie)时,我的代码按预期执行,该文件位于下面构建的路径中。但是,如果我更改文件名(注释 cookie 和取消注释 testLoadBook.xls),PHP 执行返回正确的数组(表明 PHPExcel 正确执行,似乎无论如何),但抛出 500 错误。

<?php
spl_autoload_unregister(array('YiiBase','autoload'));
set_include_path(get_include_path() . PATH_SEPARATOR . Yii::app()->getBasePath().'/extensions/phpexcel/Classes/');
require_once('PHPExcel/IOFactory.php');
//$excelFile = dirname(__FILE__).'/'.'cookies.xls';
$excelFile = dirname(__FILE__).'/'.'testLoadBook.xls';

echo $excelFile;

//$objPHPExcel = PHPExcel_IOFactory::load($excelFile);


$excelReader = PHPExcel_IOFactory::createReader('Excel5'); //if file extension is .xls
//$excelReader->setReadDataOnly(true);

$excelObj = $excelReader->load($excelFile);

$response = array();
$worksheet = $excelObj->getActiveSheet();

$highestRow = $worksheet->getHighestRow(); // e.g. 10
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;

$response[] = array($highestRow,$highestColumnIndex);    
for ($row = 1; $row <= $highestRow; $row++) {
    for ($col = 0; $col < $highestColumnIndex; $col++) {
        $cell = $worksheet->getCellByColumnAndRow($col, $row);
        $val = $cell->getValue();
        $dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);

        $response[] = array($row,$col,$val);
    }
}

echo json_encode($response);

?>

回显文件路径表明正在引用相同的确切目录(两个文件都存在那里)。两个文件的权限是一样的。我尝试了两种不同的方法来加载工作簿:

$objPHPExcel = PHPExcel_IOFactory::load($excelFile);

$excelReader = PHPExcel_IOFactory::createReader('Excel5'); //if file extension is .xls
$excelObj = $excelReader->load($excelFile);
$worksheet = $excelObj->getActiveSheet();

这两种解决方案都可以在 cookies.xls 工作簿上正确执行而不会出错。

对于可能令人困惑的描述,我深表歉意,但我想不出任何原因会在返回预期输出的同时抛出 500。

感谢任何人对此的帮助。

格雷格

4

2 回答 2

1

该错误似乎需要一些未包含的文件,您可以试试这个

spl_autoload_unregister(array('YiiBase','autoload'));
Yii::import('ext.PHPExcel.Classes.PHPExcel', true);
spl_autoload_register(array('YiiBase','autoload'));

参考:

1) http://www.yiiframework.com/forum/index.php/topic/31998-problem-loading-phpexcel/

于 2013-06-03T20:23:49.730 回答
1

我能够确定正在发生的问题。在 PHP 脚本执行完毕后,Yii 正在寻找 CList.php 文件。Yii 无法找到类文件,因为 Yii 已通过以下方式取消注册:

spl_autoload_unregister(array('YiiBase','autoload'));

这允许 PHPExcel 正确执行并用指定文件的正确数组填充 httpRequest.responseText。当 PHP 文件完成执行并返回到调用它的 JavaScript 时,问题就出现了。此时,Yii 已经取消注册并且从未重新加载。必须使用下面的方法,因为 PHPExcel 有自己的自动加载器,会干扰 Yii。

一旦我弄清楚了,问题的解决方案就相当简单了:

$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.Classes'); //get path for PHPExcel
spl_autoload_unregister(array('YiiBase','autoload')); //unload Yii

//include PHPExcel and autoloader will execute automatically
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

//do PHPExcel operations: load file, parse and create array, echo JSON array

spl_autoload_register(array('YiiBase','autoload')); //reload Yii before returning to page

参考: http ://www.ramirezcobos.com/2010/11/05/how-to-use-phpexcel-with-yii/

编辑:感谢上面的 SilentSakky 链接帮助我解决这个问题的参考

于 2013-06-05T14:11:43.590 回答