Формирование 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-объекта, можно обращаться к его свойствам и методам:
    <?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;
    ?>


    Заключение


    Если статья оказалась Вам полезна и интересна, буду рад подготовить продолжение, где более подробно будут рассматриваться методы работы с листами документов, ячейками и границами.
    Разумеется, если это кому-то интересно и необходимо для работы.
    Поделиться публикацией

    Похожие публикации

    Комментарии 24

      –2
      Пожалуйста, укажите в теме, что всё вышеперечисленное, работает только под Windows.
        +2
        Это написано во «Введении» и выделено жирным шрифтом.
          0
          И ещё не забудьте что нужен не только Windows, но ещё и установленный на нём Office.
            0
            С этими com-функциями люди с Windows, но openoffice и др. вместо MS Office тоже «отдыхают». Так что область их применения крайне низкая, поэтому по ним даже документаций толковых нет. Советую не пользоваться когда что-то делаете не для одного компьютера.
          +4
          А чем вас не устраивает решение Spreadsheet_Excel_Writer? Кроссплатформенно, навалом документации и примеров, работает без проблем (есть конечно трудности когда затираешь ячейку).
            0
            Существует множество решений и не только это.
            Данный метод реализован при помощи COM-объектов и даже если на практике не пригодится, для общего развития, думаю, лишним не будет.
              0
              Файлы он не открывает, а значит и изменять документы не может.
                0
                Файлы он не открывает, а значит и изменять документы не может.

                У меня создаётся впечатление, что народ открывает статью не для того, что бы её прочитать, а что бы просто чё-нить написать в комментах.
                Чтаем материал под заголовком «Открытие ранее созданного документа», который находится на две тысячи пикселей выше.
                  0
                  Извиняюсь, не сразу сообразил о чём речь.
                  Сказывается недосыпание :(
                0
                Согласен, разве что Spreadsheet_Excel_Writer к сожалению ест слишком много оперативки, поэтому если требуется выгрузить очень много инфы — придётся подумать об альтернативах
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Уж извините, но передо мной стояла именно такая задача. Именно средствами PHP и именно на винде.
                  Для общего развития можно взять любой язык. Мне лично ближе PHP ибо им сейчас занимаюсь. А толковый/не толковый — всё в конечном итоге зависит от составленного ТЗ.
                  +3
                  А можно просто создавать таблицу html, указать тип файла .xls, и ексель с радостью его скушает.
                    0
                    А можно здесь поподробнее?
                      0
                      ну для примера напишите в текстовом файле:

                      <table>
                      <tr>
                      <td width=100>text
                      </td>
                      <td><b>text</b>
                      </td>
                      </tr>
                      </table>

                      и назовите файл text.xls
                      Попробуйте его открыть
                        0
                        Кстати, в моем движке магазина генерируется прайс в формате екселя без всяких библиотек.
                        Вот живой пример: скачивание прайса с интернет-магазина:

                        simplacms.ru/demo/pricelist.xls

                        Откройте этот файл как простой текст, посмотрите
                        0
                        Именно так я сделал в одном своем проекте на работе. Нужно было формировать отчеты сложной формы (налоговую накладную, счета, другие) на основе данных из таблиц MySQL. Благо, формы отчетов в виде файла Excel были, сохранил их в формате html, добавил необходимые специальные теги (чтобы можно было вместо них подставлять свои значения), за полчаса сделал небольшой парсер для замены спецтегов. Правда, программа была на С++ (Visual C++), еще час отладки — отличный создатель отчетов произвольной формы своими силами. Вот уже 4 года, как исправно работает…

                        Так что такой вариант имеет право на жизнь
                        +1
                        Если шрифты не нужны, то лучше csv использовать. Проблем меньше, читается везде, оверхеда почти нет.
                          –1
                          Соль как раз таки и заключается в том, что бы впоследствии можно было отформатировать ширину колонок, толщину границ, типы и размеры шрифтов в отдельно взятых ячейках.
                          Про CSV, мне кажется, знают все, кто когда-либо занимался импортом/экспортом данных.
                          0
                          Увы… Если работает только на Виндусе, то толку маловато…
                          Но все же, может кому-то пригодится.
                            0
                            Делал проще. Можно набрасать книгу в Excel и сохранить в формате XML (вроде поддерживается с 2003 версии). Далее работать с этим файлом либо как с XML-кой, либо, если логика простая можно как с обычным шаблоном, например, в Smarty. Итоговый файл сохраняется с расширением xls и для пользователя ничем от обычного не отличается.
                              0
                              Есть готовые библиотеки для PHP, создают XLS-XML, а некоторые — даже и «бинарник».
                                0
                                |…
                                | $xls->Workbooks->Open(«C:\my_doc.xls»); // Открываем ранее сохраненный документ
                                | ?>
                                | Внимание! Если указать не полный, а относительный путь,
                                | то поиск открываемого файла будет происходить не
                                | на сервере, а на компьютере пользователя. По умолчанию это папка «Мои документы».

                                Можно об этом подробнее?
                                  0
                                  да, реал на чепуху похоже =\

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое