Следующая версия | Предыдущая версия |
drupal:импорт_и_экспорт_данных_с_помощью_phpexcel [2015/09/29 00:35] – внешнее изменение 127.0.0.1 | drupal:импорт_и_экспорт_данных_с_помощью_phpexcel [2017/01/16 12:31] (текущий) – mirocow |
---|
{{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 долгое время была большой проблемой. поэтому я стал искать альтернативы. |
Убедитесь что на вашем сервере стоит 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: |
| |
Заметьте, что нумерация строк начинается с 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'); |
//$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); | //$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); |
$objWriter->save('MyExcel.xslx); | $objWriter->save('MyExcel.xslx); |
| </code> |
Есть методы для изменения стиля, формата, слияния и проверки ячеек. Для более подробной информации - смотрите документацию. | Есть методы для изменения стиля, формата, слияния и проверки ячеек. Для более подробной информации - смотрите документацию. |
| |
Чтение из файла так же просто как и запись в него. Вновь используется класс 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"); |
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 определенно стоит обратить внимание, т.к. он может работать со многими форматами. |