Создание Excel документа на PHP (генерация .xls файлов)
Привет! Однажды у меня возникала задача по генерации отчетов в Excel на backend’е, которую я решил и теперь могу поделиться одним из способов создания документов Excel и добавлением в них данных средствами PHP.
Существует несколько библиотек для работы с xls файлами на PHP, но мы рассмотрим PHPExcel, попробуем создать файл xls, наполнить его данными и немного оформить стиль, то есть разберемся с базовым функционалом, которого будет достаточно для выполнения многих задач связанных с генерацией документов Excel на PHP. Однако, библиотека позволяет делать многое, в том числе работать с формулами, применять различные стили оформления, работать с листами.
Код скрипта, который вы увидите по ходу прочтения статьи, доступен на github.
Библиотека PHPExcel доступна в Composer как PHPOffice/PHPExcel. Я инициализирую в пустом каталоге composer и добавлю в зависимости PHPOffice/PHPExcel.
$ composer init $ composer require PHPOffice/PHPExcel
После создам файл generator.php и в нем подключу автозагрузку библиотек Composer’а.
Теперь можно приступить к работе, используя библиотеку PHPExcel.
Давайте создадим пустой документ со списком котов «CatList».
$document = new \PHPExcel(); $objWriter = \PHPExcel_IOFactory::createWriter($document, 'Excel5'); $objWriter->save("CatList.xls");
Мы создали экземпляр класса PHPExcell и создали объект, используя фабрику, который занимается сохранением документов. Кстати, вторым аргументом метода createWriter можно передавать значение «PDF» и таким образом генерировать PDF файлы средствами PHP.
После запуска скрипта в директории появился файл CatList.xls, его можно открыть в Excel и убедиться, что он пустой и программа его открывает без ошибок.
Заполнение Excel документа данными
Давайте попробуем засунуть в файл список котов, создав три столбца с порядковым номером, именем и цветом шерстки. Сперва нам нужны исходные данные, их мы создадим вручную в виде массива
$catList = [ ['name' => 'Tom', 'color' => 'red'], ['name' => 'Bars', 'color' => 'white'], ['name' => 'Jane', 'color' => 'Yellow'], ];
Наша табличка будет иметь заголовок, вписанный в три объединенные клетки. При этом мы сделаем возможность выбора координат для отрисовки таблички.
$document = new \PHPExcel(); $sheet = $document->setActiveSheetIndex(0); // Выбираем первый лист в документе $columnPosition = 0; // Начальная координата x $startLine = 2; // Начальная координата y // Вставляем заголовок в "A2" $sheet->setCellValueByColumnAndRow($columnPosition, $startLine, 'Our cats'); // Выравниваем по центру $sheet->getStyleByColumnAndRow($columnPosition, $startLine)->getAlignment()->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // Объединяем ячейки "A2:C2" $document->getActiveSheet()->mergeCellsByColumnAndRow($columnPosition, $startLine, $columnPosition+2, $startLine); // Перекидываем указатель на следующую строку $startLine++;
На выходе получаем документ с заголовком, вставленным в объединенную ячейку по центру. Перейдем к отрисовке шапки.
// Массив с названиями столбцов $columns = ['№', 'Name', 'Color']; // Указатель на первый столбец $currentColumn = $columnPosition; // Формируем шапку foreach ($columns as $column) < // Красим ячейку $sheet->getStyleByColumnAndRow($currentColumn, $startLine) ->getFill() ->setFillType(\PHPExcel_Style_Fill::FILL_SOLID) ->getStartColor() ->setRGB('4dbf62'); $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $column); // Смещаемся вправо $currentColumn++; >
Перейдем к заполнению данными из списка наших котов.
// Формируем список foreach ($catList as $key=>$catItem) < // Перекидываем указатель на следующую строку $startLine++; // Указатель на первый столбец $currentColumn = $columnPosition; // Вставляем порядковый номер $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $key+1); // Ставляем информацию об имени и цвете foreach ($catItem as $value) < $currentColumn++; $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $value); > >
Теперь, открыв отчёт, можно убедиться, что он сформирован как нужно.
'Tom', 'color' => 'red'], ['name' => 'Bars', 'color' => 'white'], ['name' => 'Jane', 'color' => 'Yellow'], ]; $document = new \PHPExcel(); $sheet = $document->setActiveSheetIndex(0); // Выбираем первый лист в документе $columnPosition = 0; // Начальная координата x $startLine = 2; // Начальная координата y // Вставляем заголовок в "A2" $sheet->setCellValueByColumnAndRow($columnPosition, $startLine, 'Our cats'); // Выравниваем по центру $sheet->getStyleByColumnAndRow($columnPosition, $startLine)->getAlignment()->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // Объединяем ячейки "A2:C2" $document->getActiveSheet()->mergeCellsByColumnAndRow($columnPosition, $startLine, $columnPosition+2, $startLine); // Перекидываем указатель на следующую строку $startLine++; // Массив с названиями столбцов $columns = ['№', 'Name', 'Color']; // Указатель на первый столбец $currentColumn = $columnPosition; // Формируем шапку foreach ($columns as $column) < // Красим ячейку $sheet->getStyleByColumnAndRow($currentColumn, $startLine) ->getFill() ->setFillType(\PHPExcel_Style_Fill::FILL_SOLID) ->getStartColor() ->setRGB('4dbf62'); $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $column); // Смещаемся вправо $currentColumn++; > // Формируем список foreach ($catList as $key=>$catItem) < // Перекидываем указатель на следующую строку $startLine++; // Указатель на первый столбец $currentColumn = $columnPosition; // Вставляем порядковый номер $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $key+1); // Ставляем информацию об имени и цвете foreach ($catItem as $value) < $currentColumn++; $sheet->setCellValueByColumnAndRow($currentColumn, $startLine, $value); > > $objWriter = \PHPExcel_IOFactory::createWriter($document, 'Excel5'); $objWriter->save("CatList.xls");
Для вас это может быть интересно:
Создание Excel документа на PHP (генерация .xls файлов) : 7 комментариев
Формирование Excel-документов средствами PHP
Возможность создания Excel-документов в общих чертах уже была описана на Хабре, но полной информации из этих статей мне получить не удалось. Пришлось заняться собственными изысканиями, результатами которых я хотел бы с Вами поделиться. Данная статья будет полезна и новичкам, и профессионалам, столкнувшимся с проблемой динамического формирования Excel-документов.
Это всего лишь первая часть серии статей, которыми хотелось бы поделиться с общественностью. В последующих статьях будут более подробно рассмотрены некоторые способы и нюансы выгрузки xls-файлов.
Введение
Не хочу распространяться на тему того, зачем необходима выгрузка в Excel. Мне кажется, что это вполне очевидно: в формате MS Excel достаточно удобно предоставлять пользователю загружаемые данные. Это могут быть прайс-листы, каталоги или любая подобная служебная, статистическая и иного рода информация.
Сразу хочу оговориться, что в статье рассматривается работа с документами через COM-объекты. Данный метод таботает только на Windows-платформах. Другими словами, если Вы предпочитаете *nix-хостинг, этот метод Вам не подходит.
Синтаксис
Создание COM-объекта осуществляется следующим образом:
$my_com_object = new COM($object_class);
, где
$my_com_object — новый COM-объект;
$object_class — id-класс требуемого объекта.
Для создания Excel-документов переменной $object_class необходимо задать значение «Excel.Application» либо «Excel.sheet».
$xls = new COM(«Excel.Application»);
После создания нового COM-объекта, можно обращаться к его свойствам и методам:
$xls = new COM(«Excel.Application»); // Создание объекта
$xls->Application->Visible = 1; // Делаем объект видимым
$xls->Workbooks->Add(); // Добавляем новую книгу (создаём документ)
$rangeValue = $xls->Range(«A1»);
$rangeValue->Value = «Декорация текста: жирный, подчеркнутый, наклонный»;
$rangeValue = $xls->Range(«A2»);
$rangeValue->Value = «Размер шрифта: 14»;
$rangeValue = $xls->Range(«A3»);
$rangeValue->Value = «Тип шрифта: Arial»;
$range=$xls->Range(«A1:J10»); // Указываем область ячеек
$range->Select(); // Выделяем эту область
$fontRange=$xls->Selection(); // Присваиваем переменной выделенную область
// Отформатируем текст в выделенной области
$fontRange->Font->Bold = true; // Жирный
$fontRange->Font->Italic = true; // Курсив
$fontRange->Font->Underline = true; // Подчеркнутый
$fontRange->Font->Name = «Arial»; // Тип шрифта
$fontRange->Font->Size = 14; // Размер шрифта
?>
Открытие, запись, закрытие документа
Общие возможности
- создать новый документ
- открыть ранее созданный документ
- сохранить открытый документ
- закрыть документ
Создание нового документа
- создаем «связь» между PHP и Excel (создается дескриптор, как при работе с файлами)
- указываем, будет ли визуально открыта программа или нет
- указываем программе через дескриптор, что нужно открыть новый документ
Открытие ранее созданного документа
Открытие документа можно сделать при помощи метода Open() объекта Workbooks().
В передаваемом методу Open() параметре нужно указать имя открываемого файла:
$xls = new COM(«Excel.Application»); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Делаем его видимым
$xls->Workbooks->Open(«C:\my_doc.xls»); // Открываем ранее сохраненный документ
?>
Внимание! Если указать не полный, а относительный путь, то поиск открываемого файла будет происходить не на сервере, а на компьютере пользователя. По умолчанию это папка «Мои документы».
Сохранение открытого документа
Сохранение открытого документа производится при помощи метода SaveAs() объекта Workbooks():
$xls = new COM(«Excel.Application»); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Делаем его видимым
$xls->Workbooks->Add();
$range=$xls->Range(«A1»); // Выбираем ячейку A1
$range->Value = «Проба записи»; // Вставляем значение
// Сохраняем документ
$xls->Workbooks[1]->SaveAs(«my_doc.xls»);
$xls->Quit(); //Закрываем приложение
$xls->Release(); //Высвобождаем объекты
$xls = Null;
$range = Null;
?>
Хочу отдельно отметить, что высвобождение объектов — это очень хорошо и правильно. Да сгорят в священном очищающем пламени костров Инквизиции те, кто считает иначе.
Закрытие документа
Закрытие документа производится методом Quit().
$xls = new COM(«Excel.Application»); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Делаем его видимым
$xls->Workbooks->Add();
$range=$xls->Range(«A1»); // Выбираем ячейку A1
$range->Value = «Что-то записываем»; // Вставляем значение в ячейку
// Сохраняем документ
$xls->Workbooks[1]->SaveAs(«my_doc.xls»);
$xls->Quit(); // Закрываем приложение
$xls->Release(); // Высвобождаем объекты
$xls = Null;
$range = Null;
?>
Заключение
Если статья оказалась Вам полезна и интересна, буду рад подготовить продолжение, где более подробно будут рассматриваться методы работы с листами документов, ячейками и границами.
Разумеется, если это кому-то интересно и необходимо для работы.