29 March 2009

Формирование Excel-документов средствами PHP

Lumber room
Возможность создания 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-объекта, можно обращаться к его свойствам и методам:
<?php
$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; // Размер шрифта
?>


Открытие, запись, закрытие документа

Общие возможности

В Excel при помощи PHP можно:
  • создать новый документ
  • открыть ранее созданный документ
  • сохранить открытый документ
  • закрыть документ


Создание нового документа

Создание нового документа происходит в три действия
  1. создаем «связь» между PHP и Excel (создается дескриптор, как при работе с файлами)
  2. указываем, будет ли визуально открыта программа или нет
  3. указываем программе через дескриптор, что нужно открыть новый документ

Для создания дескриптора нужно использовать обращение к Excel через COM-объект:
$xls = new COM("Excel.Application");
Теперь через дескриптор $xls мы можем обращаться ко всем свойствам и методам Excel.
Будет ли отображаться Excel или нет, указывается в свойстве Visible() объекта Application().
Если мы этому свойству присвоить значение 1, то программа будет отображаться, если 0, то нет:
$xls->Application->Visible = 1;
Ну и, наконец, добавить новый документ можно при помощи метода Add() объекта Workbooks():
$xls->Workbooks->Add();
То есть для того, чтобы просто запустить при помощи PHP Excel нужно выполнить следующий код:
<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Делаем его видимым
$xls->Workbooks->Add(); // Создаём новый документ
?>

Первые две строки этого примера, разумеется, используются всегда при работе с Excel через PHP.

Открытие ранее созданного документа

Открытие документа можно сделать при помощи метода Open() объекта Workbooks().
В передаваемом методу Open() параметре нужно указать имя открываемого файла:
<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Делаем его видимым
$xls->Workbooks->Open("C:\my_doc.xls"); // Открываем ранее сохраненный документ
?>

Внимание! Если указать не полный, а относительный путь, то поиск открываемого файла будет происходить не на сервере, а на компьютере пользователя. По умолчанию это папка «Мои документы».

Сохранение открытого документа

Сохранение открытого документа производится при помощи метода SaveAs() объекта Workbooks():
<?php
$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().
<?php
$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;
?>


Заключение


Если статья оказалась Вам полезна и интересна, буду рад подготовить продолжение, где более подробно будут рассматриваться методы работы с листами документов, ячейками и границами.
Разумеется, если это кому-то интересно и необходимо для работы.
Tags:PHPExcelCOM-объекты
Hubs: Lumber room
+14
1k 36
Comments 24
Popular right now
Link Builder (SEO)
from 30,000 ₽JoinSoftRemote job
PHP developer
to 250,000 ₽РНКБ Банк (ПАО)МоскваRemote job
PHP-разработчик
from 40,000 to 60,000 ₽Dota2.ruRemote job
Digital-маркетолог
to 100,000 ₽МосиграМосква
PHP-программист
from 50,000 to 100,000 ₽СупердоставкаRemote job
Top of the last 24 hours