Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
drupal:импорт_и_экспорт_данных_с_помощью_phpexcel [2015/09/29 00:35] – внешнее изменение 127.0.0.1drupal:импорт_и_экспорт_данных_с_помощью_phpexcel [2017/01/16 12:31] (текущий) mirocow
Строка 1: Строка 1:
 {{tag>web script PHPExcel}} {{tag>web script PHPExcel}}
  
-====== PHPExcel ======+====== PHPExcel / PhpSpreadsheet ======
  
 +  * https://github.com/PHPOffice/PHPExcel
 +  * https://github.com/PHPOffice/PhpSpreadsheet#want-to-contribute ([[http://phpspreadsheet.readthedocs.io/en/develop/|Документация]])
  
 Несколько недель назад мне пришлось работать с файлами Excel в формате BIFF8 (Excel 97), т.к. заказчик не согласен был на экспорт данных в CSV. Spreadsheet_Excel_Writer вместе с Spreadsheet_Excel_Reader очень хорошо помогали мне раньше, но только с BIFF5. Поддержка таблиц BIFF8 долгое время была большой проблемой. поэтому я стал искать альтернативы. Несколько недель назад мне пришлось работать с файлами Excel в формате BIFF8 (Excel 97), т.к. заказчик не согласен был на экспорт данных в CSV. Spreadsheet_Excel_Writer вместе с Spreadsheet_Excel_Reader очень хорошо помогали мне раньше, но только с BIFF5. Поддержка таблиц BIFF8 долгое время была большой проблемой. поэтому я стал искать альтернативы.
Строка 28: Строка 30:
 Убедитесь что на вашем сервере стоит PHP 5.2.0 или старше и установлены следующие расширения: php_zip, php_xml и php_gd2. Вs можете скачать архив с PHPExcel с сайта проекта. Можно так же установить PEAR-пакет. Убедитесь что на вашем сервере стоит PHP 5.2.0 или старше и установлены следующие расширения: php_zip, php_xml и php_gd2. Вs можете скачать архив с PHPExcel с сайта проекта. Можно так же установить PEAR-пакет.
  
-Создание таблицы+===== Создание таблицы ===== 
 После распаковки скачанного архива, вы найдете папку Tests, в которой содержатся несколько демонстрационных файлов. Когда вы захотите использовать эту библиотеку, взгляните на эти примеры, чтобы познакомиться методами работы с PHPExcel. После распаковки скачанного архива, вы найдете папку Tests, в которой содержатся несколько демонстрационных файлов. Когда вы захотите использовать эту библиотеку, взгляните на эти примеры, чтобы познакомиться методами работы с PHPExcel.
  
 Теперь вы готовы к созданию вашего первого файла Excel. После создания экземпляра класса, устанавливаются некоторые метаданные: Теперь вы готовы к созданию вашего первого файла Excel. После создания экземпляра класса, устанавливаются некоторые метаданные:
  
-  require_once 'PHPExcel.php'; +<code php> 
-  $objPHPExcel = new PHPExcel(); +require_once 'PHPExcel.php'; 
-  // устанавливаем метаданные +$objPHPExcel = new PHPExcel(); 
-  $objPHPExcel->getProperties()->setCreator("PHP"+// устанавливаем метаданные 
-                  ->setLastModifiedBy("Алексей"+$objPHPExcel->getProperties()->setCreator("PHP"
-                  ->setTitle("Office 2007 XLSX Тестируем"+->setLastModifiedBy("Алексей"
-                  ->setSubject("Office 2007 XLSX Тестируем"+->setTitle("Office 2007 XLSX Тестируем"
-                  ->setDescription("Тестовый файл Office 2007 XLSX, сгенерированный PHPExcel."+->setSubject("Office 2007 XLSX Тестируем"
-                  ->setKeywords("office 2007 openxml php"+->setDescription("Тестовый файл Office 2007 XLSX, сгенерированный PHPExcel."
-                  ->setCategory("Тестовый файл"); +->setKeywords("office 2007 openxml php"
-  $objPHPExcel->getActiveSheet()->setTitle('Демо');+->setCategory("Тестовый файл"); 
 +$objPHPExcel->getActiveSheet()->setTitle('Демо'); 
 +</code>
 Как вы можете видеть, практически везде в классе используется паттерн Fluent Interface (цепочка вызовов). Как вы можете видеть, практически везде в классе используется паттерн Fluent Interface (цепочка вызовов).
  
 Имена методов говорят сами за себя. В результате выполнения этого кода создастся объект PHPExcel c метаданными, но без наполнения, кроме листа под названием "Демо". При создании объекта, первый лист создастся автоматически. Конечно, вы можете добавить еще листы, если это необходимо. Сейчас в качестве активного листа выбран первый. Этот лист Excel или Open Office покажут первым при открытии файла. Добавим "Привет, мир!" в таблицу: Имена методов говорят сами за себя. В результате выполнения этого кода создастся объект PHPExcel c метаданными, но без наполнения, кроме листа под названием "Демо". При создании объекта, первый лист создастся автоматически. Конечно, вы можете добавить еще листы, если это необходимо. Сейчас в качестве активного листа выбран первый. Этот лист Excel или Open Office покажут первым при открытии файла. Добавим "Привет, мир!" в таблицу:
  
 +<code php>
   $objPHPExcel->setActiveSheetIndex(0)   $objPHPExcel->setActiveSheetIndex(0)
               ->setCellValue('A1', 'Привет')               ->setCellValue('A1', 'Привет')
               ->setCellValue('B1', 'Мир!');               ->setCellValue('B1', 'Мир!');
 +</code>
 Обращаться к ячейкам можно через координаты Excel, например, "С3". Это не очень удобно, когда надо перебрать содержимое большого количества ячеек. К счастью есть другой метод для того чтобы обратиться к ячейке - с помощью координат X и Y: Обращаться к ячейкам можно через координаты Excel, например, "С3". Это не очень удобно, когда надо перебрать содержимое большого количества ячеек. К счастью есть другой метод для того чтобы обратиться к ячейке - с помощью координат X и Y:
  
Строка 56: Строка 63:
 Заметьте, что нумерация строк начинается с 1, то есть координаты ячейки "A1" будут (0,1). Последний шаг - сохраняем файл Excel на диск. Для этого надо создать объект для записи, используя PHPExcel_IOFactory. Второй параметр определяет формат файла. Заметьте, что нумерация строк начинается с 1, то есть координаты ячейки "A1" будут (0,1). Последний шаг - сохраняем файл Excel на диск. Для этого надо создать объект для записи, используя PHPExcel_IOFactory. Второй параметр определяет формат файла.
  
 +<code php>
   require_once 'PHPExcel/IOFactory.php';   require_once 'PHPExcel/IOFactory.php';
   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
Строка 61: Строка 69:
   //$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');   //$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
   $objWriter->save('MyExcel.xslx);   $objWriter->save('MyExcel.xslx);
 +</code>  
 Есть методы для изменения стиля, формата, слияния и проверки ячеек. Для более подробной информации - смотрите документацию. Есть методы для изменения стиля, формата, слияния и проверки ячеек. Для более подробной информации - смотрите документацию.
  
Строка 68: Строка 77:
 Чтение из файла так же просто как и запись в него. Вновь используется класс IOFactory для доступа к файлу: Чтение из файла так же просто как и запись в него. Вновь используется класс IOFactory для доступа к файлу:
  
 +<code php>
   require_once 'PHPExcel/IOFactory.php';   require_once 'PHPExcel/IOFactory.php';
   $objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");   $objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");
 +</code>
 Использование итератора листов позволяет вам получить структуру файла. Следующий пример показывает, как это можно сделать: Использование итератора листов позволяет вам получить структуру файла. Следующий пример показывает, как это можно сделать:
  
 +<code php>
   require_once 'PHPExcel/IOFactory.php';   require_once 'PHPExcel/IOFactory.php';
   $objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");   $objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");
Строка 99: Строка 111:
       echo '</table>';       echo '</table>';
   }   }
 +</code>
 Используя всего три строки кода можно легко конвертировать файлы из одного формата в другой: Используя всего три строки кода можно легко конвертировать файлы из одного формата в другой:
  
 +<code php>
   $objPHPExcel = PHPExcel_IOFactory::load("XMLTest.xml");   $objPHPExcel = PHPExcel_IOFactory::load("XMLTest.xml");
   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
   $objWriter->save('covertedXml2Xlsx.xlsx');   $objWriter->save('covertedXml2Xlsx.xlsx');
 +</code>
 Другое интересное решение - использовать бизнес-логику из Excel файла. Вместо повторного создания кода, вы можете выполнить код сохраненный в Excel. Другое интересное решение - использовать бизнес-логику из Excel файла. Вместо повторного создания кода, вы можете выполнить код сохраненный в Excel.
  
 Так же возможно (а еще и быстрее, чем создание с нуля) загрузить файл Excel, а затем добавить в него данные. Базовый файл можно хранить как шаблон и использовать, заполняя нужными данными. А когда меняется макет - просто менять шаблон. Так же возможно (а еще и быстрее, чем создание с нуля) загрузить файл Excel, а затем добавить в него данные. Базовый файл можно хранить как шаблон и использовать, заполняя нужными данными. А когда меняется макет - просто менять шаблон.
  
-Небольшое замечание+==== Небольшое замечание ==== 
 PHPExcel очень требователен к памяти. Для одной ячейки надо около 1КБ памяти. При работе с большими таблицами, вы можете столкнуться с определенными трудностями. Тем не менее, разработчики позаботились об этом предоставив механизм кэширования: CachedObjectStorageFactory. Что говорит об этом руководство: PHPExcel очень требователен к памяти. Для одной ячейки надо около 1КБ памяти. При работе с большими таблицами, вы можете столкнуться с определенными трудностями. Тем не менее, разработчики позаботились об этом предоставив механизм кэширования: CachedObjectStorageFactory. Что говорит об этом руководство:
  
 Механизм кэширования ячеек позволяет PHPExcel манипулировать объектами потреблять меньше памяти в PHP, используя жесткий диск, APC, memcache или Wincache. Это позволяет работать с большими таблицами используя небольшие объемы памяти, хоть и платя за это скоростью обращения к ячейкам. Механизм кэширования ячеек позволяет PHPExcel манипулировать объектами потреблять меньше памяти в PHP, используя жесткий диск, APC, memcache или Wincache. Это позволяет работать с большими таблицами используя небольшие объемы памяти, хоть и платя за это скоростью обращения к ячейкам.
  
-В будущем+==== В будущем ==== 
 PHPExcel не умеет создавать диаграммы - пока что. Это пока в планах, но работа над ними уже ведется. Возможно в следующем релизе можно будет создавать диаграммы. PHPExcel не умеет создавать диаграммы - пока что. Это пока в планах, но работа над ними уже ведется. Возможно в следующем релизе можно будет создавать диаграммы.
  
-Заключение+==== Заключение ==== 
 PHPExcel имеет большой набор методов, по настоящему нужных программисту. Документация хорошо структурирована и большое число демонстрационных файлов позволяет легко найти как нужно использовать класс. Кроме этого файлы документированы с помощью PHPDocBlocks, так что при использовании IDE, таких как ZendStudio или NetBeans, вы будуте получать подсказки по использованию методов классов. PHPExcel имеет большой набор методов, по настоящему нужных программисту. Документация хорошо структурирована и большое число демонстрационных файлов позволяет легко найти как нужно использовать класс. Кроме этого файлы документированы с помощью PHPDocBlocks, так что при использовании IDE, таких как ZendStudio или NetBeans, вы будуте получать подсказки по использованию методов классов.
  
 В заключение: на PHPExcel определенно стоит обратить внимание, т.к. он может работать со многими форматами. В заключение: на PHPExcel определенно стоит обратить внимание, т.к. он может работать со многими форматами.