В Excel, на экспорт!

Кислицин Никита

Хакер, номер #072, стр. 072-116-1

(nikitoz@real.xakep.ru)

Учимся экспортировать web-данные в формат Excel’я

Скоро Новый год, и воздух постепенно наполняется этой неповторимой зимней негой, которая пахнет мандаринами, снегом, елкой, глинтвейном и лыжным парафином. Ты, наверное, уже вовсю бегаешь по магазинам в поисках спиртного, зеленой елки, игрушек и смешных подарков. С моей стороны было бы большой подставой разрушать эту атмосферу, поэтому я хочу поддержать твое новогодне-романтическое настроение и рассказать о проблеме экспорта данных из web-среды в формат xls.

Столкновение с задачей

На самом деле это весьма актуальная задача. Последний раз я сталкивался с ней, когда писал автоматизированную систему редакторской работы над текстом. Я пожалел нашего литературного редактора и не стал, как Горлум, писать программу, которая бы автоматически редактировала тексты специальным эвристическим алгоритмом (в основном эта прога вставляет матерные слова, кстати. Редактирования я за ней не заметил. – Прим. Dr.). Я хотел лишь сделать систему, которая бы позволила удобно управлять работой авторов и генерировать оптимальным образом план «Взлома», а также ряд других документов. Проблема была в том, что все эти документы, которыми мы обмениваемся в редакции, находятся в формате экселевских таблиц, и мне надо было, чтобы не сильно напрягать суровых боссов Куттера и Симбиозиса, научиться экспортировать данные из PHP-скриптов в этот формат. Это оказалось совсем даже не сложно!

Судя по приходящим мне письмам, эта проблема актуальна и для многих читателей. Поэтому я решил отнять у тебя 15 минут и рассказать о том, как же это можно реализовать.

Набор юного хирурга

Возможно, тебе покажется, что это очень сложно – генерировать xls-файлы в PHP. Ведь Microsoft использует специальный нетекстовый формат представления данных. И обрати внимание, я говорю не о банальном импорте в Excel текстовых файлов с разделяемыми двоеточием полями, а о генерировании полноценных xls-листов со всем форматированием и даже встроенной логикой. Конечно, эти функции доступны только после установки специального расширения PEAR::Spreadsheet_Excel_Writer, но возможности, которые открывает этот модуль, превосходят все ожидания! Он написан на чистом PHP без использования каких-либо системных расширений, поэтому твои программы будут работать под любой, даже самой экзотичной unix-системой и, разумеется, под виндой. Фактически PEAR::Spreadsheet_Excel_Writer вместе с PEAR::OLE создают полноценный интерфейс для работы с XLS-файлами. Мне остается лишь выразить респект ребятам, которые наколбасили такое гипернужное расширение, – это Ксавьер Ногюер (Xavier Noguer) и Мика Тупола (Mika Tuupola).

Точим коньки

Прежде чем приступать к активной работе, необходимо установить расширение PEAR::Spreadsheet_Excel_Writer. Делается это элементарно:

$ pear install -f OLE

$ pear install –f Spreadsheet_Excel_Writer

Утилита pear сама скачает из инета самую свежую версию этих расширений и установит их в нужное место. Обрати внимание на флаг –f: он необходим, чтобы можно было устанавливать не только stable версии, но и бетки. После того как установка завершена, ты уже можешь использовать всю мощь этого пакета. Давай, чтобы не засиживаться на месте, разберемся, как пишутся программы для генерации документов Excel. Прежде всего, необходимо подключить к твоему сценарию Spreadsheet_Excel_Writer. Это довольно легко сделать при помощи вызова функции require("Spreadsheet/Excel/Writer.php"). Затем нужно сделать экземпляр класса и получить ссылку на этот объект, делается это в общем случае примерно так: $xl =& new Spreadsheet_Excel_Writer(). Обрати внимание: знак амперсанда («&») символизирует операцию получения ссылки-указателя на этот объект. Затем необходимо создать файл и добавить к нему новый лист, не забыв получить адрес нового объекта: $sheet =& $xls-> addWorksheet('Binary Count'). После этого мы уже можем добавлять на лист сведения при помощи метода write(), а в конце работы обязаны завершить работу с листом, вызвав процедуру close(). В итоге получается примерно такая вот схема:

Содержание  Вперед на стр. 072-116-2
ttfb: 3.5269260406494 ms