使用XMLHttpRequest对象到PHP, responseText是正确的数组,但是抛出500错误.无法识别错误的


Using XMLHttpRequest object to PHP, responseText is correct array, but 500 error thrown. Cannot identify cause of error

我一直在使用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。

谢谢大家的帮助。

格雷格

我能够确定正在发生的问题。在PHP脚本执行完成后,我正在寻找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链接的参考资料,帮助我解决这个

错误似乎是需要一些文件,但不包括在内,你可以试试这个

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/