Форумы портала PHP.SU » » CMS и фреймворки » PHPExcel и yii! Не работает!

Страниц (1): [1]
 

1. quinlena - 19 Июля, 2013 - 14:48:56 - перейти к сообщению
Посмотрела кучу тем по этому поводу, никак не получается. Последний раз пробовала вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.vendor');
  3.                     spl_autoload_unregister(array('YiiBase','autoload'));
  4.                     include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
  5.                     $objPHPExcel = new PHPExcel();
  6.                    $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
  7.  
  8.                     header('Content-Type: application/vnd.ms-excel');
  9.                     header('Content-Disposition: attachment;filename="11.xls"');
  10.                     header('Cache-Control: max-age=0');
  11.                     $objWriter->save('php://output');
  12.  


Выдает ошибки: Fatal error: Class 'PHPExcel_CalcEngine_CyclicReferenceStack' not found
Fatal error: Class 'CListIterator' not found

Не работает автозагрузчик? Или что это может быть?
Пробовала еще таким способом http://www[dot]yiiframework[dot]com/wiki[dot][dot][dot]reate-new-sheet/ тоже не работает... Помогите....
2. esterio - 19 Июля, 2013 - 15:04:20 - перейти к сообщению
1. создаем папку PHPExel в каталоге extensions
2. заходим в конфиг, ищем ключ import. там добавляем елемент ext.PHPExel.*
3. бросаем весь PHPExcel в каталог PHPExel
4. PROFIT
PHP:
скопировать код в буфер обмена
  1. $objPHPExcel = new PHPExcel();
  2. $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
  3.  header('Content-Type: application/vnd.ms-excel');
  4. header('Content-Disposition: attachment;filename="11.xls"');
  5. header('Cache-Control: max-age=0');
  6. $objWriter->save('php://output');

5. после добавляем


Вашы ошибкы
1. Yii имеет свой автолоадер, который стартует автоматически
2. сенс в автолоадере если есть include
3. quinlena - 19 Июля, 2013 - 17:29:16 - перейти к сообщению
esterio пишет:
1. создаем папку PHPExel в каталоге extensions
2. заходим в конфиг, ищем ключ import. там добавляем елемент ext.PHPExel.*
3. бросаем весь PHPExcel в каталог PHPExel
4. PROFIT
PHP:
скопировать код в буфер обмена
  1. $objPHPExcel = new PHPExcel();
  2. $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
  3.  header('Content-Type: application/vnd.ms-excel');
  4. header('Content-Disposition: attachment;filename="11.xls"');
  5. header('Cache-Control: max-age=0');
  6. $objWriter->save('php://output');

5. после добавляем


Вашы ошибкы
1. Yii имеет свой автолоадер, который стартует автоматически
2. сенс в автолоадере если есть include


Выдает ошибку include(PHPExcel.php): failed to open stream: No such file or directory
4. quinlena - 23 Июля, 2013 - 12:57:57 - перейти к сообщению
Тема еще актуальна. Добилась скачивания файла, однако и там ошибки
<br />
<b>Fatal error</b>: Class 'CExceptionEvent' not found in <b>/usr/local/lib/php/includes/yii/framework/base/CApplication.php</b> on line <b>714</b><br />
<br />
<b>Fatal error</b>: Class 'CListIterator' not found in <b>/usr/local/lib/php/includes/yii/framework/collections/CList.php</b> on line <b>90</b><br />
5. Мелкий - 23 Июля, 2013 - 13:06:18 - перейти к сообщению
Каким образом добились? spl_autoload_unregister всё так же присутствует? Тогда разумеется, автозагрузка не может найти классы Yii.
6. quinlena - 23 Июля, 2013 - 13:07:38 - перейти к сообщению
Мелкий пишет:
Каким образом добились? spl_autoload_unregister всё так же присутствует? Тогда разумеется, автозагрузка не может найти классы Yii.

Да, есть. Вот такой пример
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //
  3. // VERY DUMMY TEST CONTROLLER
  4. // FOR THE SAKE OF THE EXAMPLE
  5. // TEST IT AS http : / / <yourapplicationurl> / index.php ? r=test/test
  6. class TestController extends Controller{
  7.      // no layouts here
  8.      public $layout = '';
  9.      public function actionTest()
  10.      {
  11.  
  12.      //
  13.      // get a reference to the path of PHPExcel classes
  14.      $phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.Classes');
  15.      // Turn off our amazing library autoload
  16.       spl_autoload_unregister(array('YiiBase','autoload'));
  17.      //
  18.      // making use of our reference, include the main class
  19.      // when we do this, phpExcel has its own autoload registration
  20.      // procedure (PHPExcel_Autoloader::Register();)
  21.     include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
  22.      // Create new PHPExcel object
  23.      $objPHPExcel = new PHPExcel();
  24.      // Set properties
  25.  
  26.      // Add some data
  27.      $objPHPExcel->setActiveSheetIndex(0)
  28.             ->setCellValue('A1', 'Hello')
  29.             ->setCellValue('B2', 'world!')
  30.             ->setCellValue('C1', 'Hello')
  31.             ->setCellValue('D2', 'world!');
  32.       // Miscellaneous glyphs, UTF-8
  33.      $objPHPExcel->setActiveSheetIndex(0)
  34.             ->setCellValue('A4', 'Miscellaneous glyphs')
  35.             ->setCellValue('A5', 'wqeqw');
  36.       // Rename sheet
  37.       $objPHPExcel->getActiveSheet()->setTitle('Simple');
  38.       // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  39.      $objPHPExcel->setActiveSheetIndex(0);
  40. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  41. header('Content-Disposition: attachment;filename="01simple.xlsx"');
  42. header('Cache-Control: max-age=0');
  43.  
  44. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
  45. $objWriter->save('php://output');
  46.        //
  47.        // Once we have finished using the library, give back the
  48.        // power to Yii...
  49.        spl_autoload_register(array('YiiBase','autoload'));
  50.        }
  51. }
  52. ?>
7. esterio - 23 Июля, 2013 - 13:27:56 - перейти к сообщению
Я настоятельно не рекомендую отключать Yii-шный автолоадер. И еще раз у Вас прописан include
quinlena пишет:
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

Смысла его отключать нету.
И еще если у phpExcel есть свой автолоадер, то они не должны конфликтовать, так как spl_autoload_register позволяет регистрировать несколько автолоадеров
8. quinlena - 23 Июля, 2013 - 13:30:45 - перейти к сообщению
esterio пишет:
Я настоятельно не рекомендую отключать Yii-шный автолоадер. И еще раз у Вас прописан include
quinlena пишет:
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

Смысла его отключать нету.
И еще если у phpExcel есть свой автолоадер, то они не должны конфликтовать, так как spl_autoload_register позволяет регистрировать несколько автолоадеров

Как он его подключит без инклуда?
(Добавление)
esterio пишет:
Я настоятельно не рекомендую отключать Yii-шный автолоадер. И еще раз у Вас прописан include
quinlena пишет:
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

Смысла его отключать нету.
И еще если у phpExcel есть свой автолоадер, то они не должны конфликтовать, так как spl_autoload_register позволяет регистрировать несколько автолоадеров

Как раз таки они и конфликтуют, в этом то вся и проблема.
(Добавление)
И еще. В консоли ошибка
Resource interpreted as Document but transferred with MIME type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
9. des1roer - 02 Сентября, 2015 - 07:57:11 - перейти к сообщению
up
(Добавление)
как можно подключить phpexcel и при клике отдавать документ с содержимым из запроса\массива?
вот что пока сделал

пробую установить вендором phpexcel

d:\open\openserver>cd D:\open\OpenServer\domains\localhost\mining\protected

D:\open\OpenServer\domains\localhost\mining\protected>composer require "yiisoft/yii:@stable"

D:\open\OpenServer\domains\localhost\mining\protected>composer require "phpoffice/phpexcel:@stable"

D:\open\OpenServer\domains\localhost\mining\protected>composer require laxu/yii-phpexcel

отсюда https://github[dot]com/laxu/yii-phpexcel

но при $model->writeExcelFile(); //\analiz\views\element\admin.php

public function writeExcelFile() //\analiz\models\Element.php
{
$manager = Yii::app()->getComponent('yii-phpexcel');
//Create empty instance
$excel = $manager->create();

//Add a header row with a grey background
$headerStyle = array(
'fill' => array(
'type' => \PHPExcel_Style_Fill::FILL_SOLID,
'color' => array('rgb' => 'CCCCCC')
)
);
$excel->addHeaderRow(
array(
'header1',
'header2',
'header3'
),
$headerStyle
);

//Add a few rows of data to the document
//Note that addData doesn't care about the actual keys in the data, only the order of values
$data = array(
array(
'data1',
'data2',
'data3',
),
array(
'id' => 1,
'name' => 'Example',
'moreData' => 'Something'
)
);

$excel->addData($data);
$excel->save();

}

получаю

CException
Неправильный алиас "laxu.yii_phpexcel". Убедитесь, что он указывает на существующую директорию или файл.

\protected\config\main.php

// application components
'components' => array(
'yii-phpexcel' => array(
'class' => '\laxu\yii_phpexcel\ExcelManager',
'savePath' => 'app.files.excel'
),

как понимаю нужно хитро autoloader настроить, не пойму как
10. Panoptik - 02 Сентября, 2015 - 17:33:57 - перейти к сообщению
это смотрели?
http://www[dot]yiiframework[dot]com/wiki[dot][dot][dot]ibrary-with-yii/

в частности вот этот коммент
http://www[dot]yiiframework[dot]com/wiki[dot][dot][dot]-with-yii/#c8432

в кратце последовательность такая
- отключаем автолоадер ии
- инклудим стартовый файл библиотеки
- инициализируем библиотеку и делаем то что требуется с ней
- включаем автолоадер ии
- продолжаем работу с приложением (моделями и тд)
11. des1roer - 03 Сентября, 2015 - 12:38:00 - перейти к сообщению
для работы PHPExcel необходимо отключить загрузчик Yii, а потом подключить. но этот код не работает в версии 1.1.16. при его выполнении выскакивает ошибка что нет файла.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  spl_autoload_unregister(array('YiiBase','autoload'));
  2.  Yii::import("ext.phpexcel.Classes.PHPExcel", true);
  3.  $objPHPExcel = new PHPExcel();
  4.  spl_autoload_register(array('YiiBase','autoload'));


может как-то можно сделать через другой загрузчик? или прописывать не в контролере а где еще?
(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1.     public function actionExcel()
  2.     {
  3. // unregister Yii's autoloader
  4.         spl_autoload_unregister(array('YiiBase', 'autoload'));
  5. // register PHPExcel's autoloader ... PHPExcel.php will do it
  6.         $phpExcelPath = Yii::getPathOfAlias('ext.phpexcel');
  7.         include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
  8. // register Yii's autoloader again
  9.         spl_autoload_register(array('YiiBase', 'autoload'));
  10.  
  11. // This requires Yii's autoloader
  12.         $models = SomeModel::model()->findAll();
  13.  
  14. // This requires PHPExcel's autoloader
  15.         $objReader = PHPExcel_IOFactory::createReader('Excel5');
  16.     }

получаю

Fatal error: Class 'CExceptionEvent' not found in D:\open\OpenServer\domains\localhost\yii\framework\base\CApplication.php on line 734

Fatal error: Class 'CException' not found in D:\open\OpenServer\domains\localhost\yii\framework\web\CThemeManager.php on line 110

такое ощущение что он обратно его подключить не может
12. Panoptik - 03 Сентября, 2015 - 16:04:35 - перейти к сообщению
des1roer пишет:
для работы PHPExcel необходимо отключить загрузчик Yii, а потом подключить. но этот код не работает в версии 1.1.16. при его выполнении выскакивает ошибка что нет файла.


CODE (htmlphp):
скопировать код в буфер обмена
  1.  spl_autoload_unregister(array('YiiBase','autoload'));
  2.  Yii::import("ext.phpexcel.Classes.PHPExcel", true);
  3.  $objPHPExcel = new PHPExcel();
  4.  spl_autoload_register(array('YiiBase','autoload'));



и обратите внимание еще на этот комментарий
http://www[dot]yiiframework[dot]com/wiki[dot][dot][dot]-with-yii/#c2273

des1roer пишет:
может как-то можно сделать через другой загрузчик? или прописывать не в контролере а где еще?

там же в статье есть упоминание того что можно пропатчить саму библиотеку

такое чувство что вы пытаетесь вызвать классы после того как автоладер отключили

а именно вот эта строчка должна быть вызвана до включения Yii шного автолоадера
PHP:
скопировать код в буфер обмена
  1. $objReader = PHPExcel_IOFactory::createReader('Excel5');

 

Powered by ExBB FM 1.0 RC1