Использование PHPExcel

#1 19 августа 2015 в 01:52
Друзья, пишу компонент, работающий с импортом из Excel файлов. Выбрал удобную библиотеку — PHPExcel. Как правильно её заинклюдить в двойку?
Сейчас прямо в нужном экшне сделал так:
  1.  
  2. $fileinc='/var/www/html/system/libs/PHPExcel/Classes/PHPExcel/IOFactory.php';
  3. include($fileinc);
  4.  
Работает, но феншуй отсутствует scratch, плюс непонятно где размещать нужный для работы библиотеки класс:
  1.  
  2. class MyReadFilter implements PHPExcel_Reader_IReadFilter
  3. {
  4. private $_startRow = 0;
  5. private $_endRow = 0;
  6. private $_columns = array();
  7.  
  8. /** Get the list of rows and columns to read */
  9. public function __construct($startRow, $endRow, $columns) {
  10. $this->_startRow = $startRow;
  11. $this->_endRow = $endRow;
  12. $this->_columns = $columns;
  13. }
  14.  
  15. public function readCell($column, $row, $worksheetName = '') {
  16. // Only read the rows and columns that were configured
  17. if ($row >= $this->_startRow && $row <= $this->_endRow) {
  18. if (in_array($column,$this->_columns)) {
  19. return true;
  20. }
  21. }
  22. return false;
  23. }
  24. }
  25.  
Сразу извиняюсь за нубские вопросы!
#2 19 августа 2015 в 06:49

Как правильно её заинклюдить в двойку?

Antuanett
У себя я сделал так
  1. cmsCore::includeFile('system/controllers/importer/includes/xls/PHPExcel.php');
а в вашем случае можно и так
  1. cmsCore::loadLib('PHPExcel/Classes/PHPExcel/IOFactory.php');

Работает, но феншуй отсутствует

Antuanett
феншуй у каждого свой smile

непонятно где размещать нужный для работы библиотеки класс

Antuanett
Вы создаёте компонент, вот в компоненте и можно его разместить. Можно в хуке разместить, можно в экшене, можно просто функцией во frontend. У себя сделал хуком, мне так удобнее.
#3 19 августа 2015 в 17:44
Вот экшн:
  1. <?php
  2.  
  3. class actionPricelisterUploadprice extends cmsAction {
  4.  
  5. public function run(){
  6. cmsCore::includeFile('system/libs/PHPExcel/Classes/PHPExcel/IOFactory.php');
  7. $form = $this->getForm('priceupload');
  8. $is_submitted = $this->request->has('submit');
  9. if ($is_submitted){
  10. $errors = false;
  11. //
  12. // Парсим и валидируем форму
  13. //
  14. if (!$errors){
  15. $data = $form->parse($this->request, $is_submitted);
  16. $errors = $form->validate($this, $data);
  17. }
  18.  
  19. if (!$errors){
  20. $config = cmsConfig::getInstance();
  21. $file_path = $config->upload_path . $data['file']['path'];
  22. $inputFileType = PHPExcel_IOFactory::identify($file_path);
  23. $objReader = PHPExcel_IOFactory::createReader($inputFileType);
  24. $objReader->setReadDataOnly(true);
  25. $xls = $objReader->load($file_path);
  26. $xls = PHPExcel_IOFactory::load($file_path);
  27. $xls->setActiveSheetIndex(0);
  28. $sheet = $xls->getActiveSheet();
  29. echo "<table>";
  30. for ($i = 1; $i <= $sheet->getHighestRow(); $i++) {
  31. echo "<tr>";
  32. $nColumn = PHPExcel_Cell::columnIndexFromString(
  33. $sheet->getHighestColumn());
  34. for ($j = 0; $j < $nColumn; $j++) {
  35. $value = $sheet->getCellByColumnAndRow($j, $i)->getValue();
  36. echo "<td>$value</td>";
  37. }
  38. echo "</tr>";
  39. }
  40. echo "</table>";
  41. dump($file_path);
  42. }
  43.  
  44. if (!$errors){
  45. if ($result['success']){
  46.  
  47. if ($back_url){
  48. $this->redirect($back_url);
  49. } else {
  50. $this->redirectToHome();
  51. }
  52.  
  53. } else {
  54. $errors = $result['errors'];
  55. }
  56.  
  57. }
  58.  
  59. }
  60.  
  61. return cmsTemplate::getInstance()->render('uploadprice', array(
  62. 'data' => $data,
  63. 'form' => $form,
  64. 'errors' => isset($errors) ? $errors : false
  65. ));
  66.  
  67. }
  68. }
Куда здесь засунуть этот класс?
#4 20 августа 2015 в 20:52
Как говорится, UP! Всё перепробовал — не хочет работать…
#5 23 августа 2015 в 12:23
Привет, я когда то делал,
  1.  
  2. if ($opt == 'users_excel') {
  3. // удаляем буфер с шапкой InstantCMS
  4.  
  5. // пересоздаем буфер вывода
  6.  
  7. // подключаем библиотеку
  8. include('excel.php');
  9.  
  10. $excel = new PHPExcel();
  11. $sheet = $excel->setActiveSheetIndex(0);
  12.  
  13. $sheet->setCellValue('A1', 'ID');
  14. $sheet->getColumnDimension('A')->setWidth(5);
  15. $sheet->setCellValue('B1', 'Логин');
  16. $sheet->getColumnDimension('B')->setWidth(25);
  17. $sheet->setCellValue('C1', 'Никнейм');
  18. $sheet->getColumnDimension('C')->setWidth(25);
  19. $sheet->setCellValue('D1', 'Email');
  20. $sheet->getColumnDimension('D')->setWidth(25);
  21.  
  22. // получаем список пользователей
  23.  
  24. $items = $model->getUsersExcel();
  25. $count = count($items);
  26.  
  27. // сохраняем список пользователей в таблице
  28. for ($i = 0; $i < $count; $i++) {
  29. $item = $items[$i];
  30.  
  31. $sheet->setCellValueExplicit('A' . ($i + 2), $item['id'], PHPExcel_Cell_DataType::TYPE_NUMERIC);
  32. $sheet->setCellValueExplicit('B' . ($i + 2), $item['login']);
  33. $sheet->setCellValueExplicit('C' . ($i + 2), $item['nickname']);
  34. $sheet->setCellValueExplicit('D' . ($i + 2), $item['email']);
  35. }
  36.  
  37. // удаляем старый временынй файл
  38. unlink(__DIR__ . '/users.xlsx');
  39.  
  40. // создаем новый временный файл
  41. $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
  42. $writer->save(__DIR__ . '/users.xlsx');
  43.  
  44. // перенаправляем пользователя на файл
  45. header('Location: /admin/components/users/users.xlsx?r=' . rand());
  46.  
  47. // прерываем вывод футера InstantCMS
  48. }
  49.  
Естественно, ещё и сама функция "getUsersExcel" в моделе с запросами нужных данных.
Задача стояла сделать импорт на 1.10.6

Скачиваю по ссылку /admin/index.php?view=components&do=config&link=users&opt=users_excel&filter=all
#6 23 августа 2015 в 14:43
Спасибо за ответ! Но немного не то, что имел ввиду. Скрипт у меня работает, но для его оптимизации необходимо создать класс (class MyReadFilter implements PHPExcel_Reader_IReadFilter, см.выше), так вот, куда его поместить — не пойму. Вставляю класс в экшн рядом с class actionPricelisterUploadprice extends cmsAction — страница перестаёт грузиться. Наверное, вопрос нубский, но я не так силён в PHP и решить проблему не могу.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.