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

?>

ファイル パスをエコーすると、まったく同じディレクトリが参照されていることがわかります (両方のファイルがそこに存在します)。両方のファイルのアクセス許可は同じです。ワークブックをロードするために、次の 2 つの異なる方法を試しました。

$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

発生していた問題を特定できました。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 に答える
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 に答える