Операционные системы Windows продолжают быть популярными и по сей день, как следствие это влияет на все отрасли касающихся персональных компьютеров, и веб разработка не стала исключением. Продукт Microsoft Office включает в себя множество полезных программ, одной из которых является Excel. Excel позволяет работать с электронными таблицами, которые успешно используются для экономическо-статистических расчетов множеством людей на планете.
Иногда возникает необходимость реализации взаимодействия файлов Excel с веб-приложениями, к примеру, необходимо импортировать какие-либо данные из таблицы документа, либо наоборот, создать документ с неким набором данных. Поговорим о том, как можно организовать взаимодействие без больших временных затрат. Сразу стоит заметить, что PHP в стандартной своей комплектации не имеет специальных функций для взаимодействия с файлами Excel. Однако это не является серьезной проблемой, обойтись без которой можно вполне.
Существует проект, его участники создали PHP-библиотеку, которая упрощает работу с файлами Excel. Библиотека называется PHPExcel, она имеет GNU лицензию и находиться в открытом доступе. Рассмотрим пример использования данной библиотеки.
Предварительно необходимо скачать архив с файлами. На данный момент, я скачал архив PHPExcel_1.7.9_doc.zip. В архиве содержится файлы библиотек, документация и примеры использования.
Со всем этим вы сможете ознакомиться самостоятельно, мы же перейдем к самому примеру. Попробуем сформировать Excel файл.
В архиве будет папка Classes, это и есть непосредственные файлы библиотеки, которые нам нужны. Копируем содержимое папки в директорию вашего проекта, туда, где вы храните все библиотеки, если таковой нет – создайте самостоятельно. Основной файл библиотеки, который следует подключить, называется PHPExcel.php, он находиться непосредственно в корне папки Classes.
Подключаем библиотеку в скрипте, перед её использованием.
require_once ('/library/PHPExcel.php');
Создаем объект:
$objPHPExcel = new PHPExcel();
Задаем информацию о создаваемом файле:
$objPHPExcel->getProperties()->setCreator("Rustam Atashev") ->setLastModifiedBy("Rustam Atashev") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("example file");
Теперь время задавать данные ячеек:
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'Код') ->setCellValue('B1', 'Имя') ->setCellValue('C1', 'Город');
Следующая строка задается таким же образом, стоит лишь обратить внимание на номера ячеек, для второй строки они будут A2, B2, C2.
Задаем имя таблицы:
$objPHPExcel->getActiveSheet()->setTitle('Справочник');
Сохраняем в файл:
$objPHPExcel->setActiveSheetIndex(0); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('Example.xlsx');
В итоге получаем файл с именем Example.xlsx, содержимое которого соответствует тому, что мы задали.
Кроме того, есть возможность более гибко использовать данную библиотеку для работы с различными параметрами таблицы. По этим вопросам рекомендуется обращаться к документации. Библиотека PHPExcel так же умеет работать с другими типами файлов, таких как Excel (BIFF). XLS, Excel 2007 (OfficeOpenXML). XLSX, CSV, Libre / OpenOffice Calc. ODS, Gnumeric, PDF, HTML, проект в целом построен вокруг OpenXML Microsoft, и PHP.
UPD:
Так же рекомендую к прочтению: PHPExcel: форматирование ячеек.
Супер, спасибо большое, как раз этого мне и не хватало, CSV не отвечает многим требованиям.
Можно ли создать файл Excel c сгруппировать строками ( + и - ) ? Если, можно, напишите небольшие примеры. Заранее благодарю!
Можно,
$objPHPExcel = new PHPExcel();
// чтобы плюсики были с верху
$objPHPExcel->getActiveSheet()->setShowSummaryBelow(false);
// ячейка первая, корневая
$objPHPExcel->getActiveSheet()->setCellValue('A1', "test1");
$objPHPExcel->getActiveSheet()->getRowDimension(1)->setOutlineLevel(0);
$objPHPExcel->getActiveSheet()->getRowDimension(1)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension(1)->setCollapsed(false);
// ячейка вторая
$objPHPExcel->getActiveSheet()->setCellValue('A2', "test2");
// указываем корневую ячейку - 1
$objPHPExcel->getActiveSheet()->getRowDimension(2)->setOutlineLevel(1);
$objPHPExcel->getActiveSheet()->getRowDimension(2)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension(2)->setCollapsed(false);
// ячейка 3
$objPHPExcel->getActiveSheet()->setCellValue('A3', "test3");
// указываем корневую ячейку - 1
$objPHPExcel->getActiveSheet()->getRowDimension(3)->setOutlineLevel(1);
$objPHPExcel->getActiveSheet()->getRowDimension(3)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension(3)->setCollapsed(false);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('file2.xlsx');
Вот это дело вложениями в несколько уровней:
$i=2;
while($i<1000)
{
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "test".$i);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setOutlineLevel(1);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setCollapsed(false);
$i++;
for($j=0;$j<5;$j++)
{
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "test".$i);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setOutlineLevel(2);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setCollapsed(false);
$i++;
for($k=0;$k<5;$k++)
{
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "test".$i);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setOutlineLevel(3);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setVisible(true);
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setCollapsed(false);
$i++;
}
}
}
А как создать файл и потом просто добавлять в него значения?