Использование Spreadsheet::WriteExcel
для формирования отчетов
Сергей Супрунов
Как было показано в статье «Внутренний веб-сервер» (журнал «Системный
администратор», №10(23), октябрь 2004 г.), веб-сервер достаточно удобно использовать
для быстрого развертывания несложных приложений, занимающихся сбором,
обработкой и выдачей пользователям тех или иных данных. Один из немногих
недостатков такого подхода, как было указано, заключается в том, что не всегда
удается распечатать качественный отчет, который не стыдно было бы представить
начальству или отослать по электронной почте, не вынуждая получателя заниматься
копированием-вставкой тела письма и его предпечатной (или в общем плане –
предварительной) обработкой.
Наиболее универсальным путем решения указанной
проблемы является формирование XML-документа, работать с которым умеют многие
программы. Однако в данной статье я хочу рассмотреть другой, менее
универсальный, но более удобный для конечного пользователя способ –
непосредственное формирование файла в формате Excel в CGI-сценарии. Дальнейшее
изложение предполагает, что вы знакомы с языком Perl и его применением для
CGI-сценариев, умеете настраивать веб-сервер, а также имеете представление о
СУБД PostgreSQL (или какой-нибудь другой). Будет рассматриваться работа под FreeBSD,
поэтому потребуется также знание базовых принципов UNIX-систем, хотя заставить
все описанное работать под Windows, думаю, особого труда не составит. У
пользователей Linux никаких проблем возникнуть также не должно.
Для решения поставленной задачи будем
использовать имеющийся в коллекции CPAN (http://cpan.org)
Perl-модуль Spreadsheet::WriteExcel, установить который во FreeBSD можно также
и из коллекции портов (/usr/ports/textproc/p5-Spreadsheet-WriteExcel), что
представляется мне более удобным.
На момент написания статьи актуальной была версия
2.11. Данная версия позволяет создавать файлы в формате BIFF8, поддерживающем Unicode.
Следовательно, необходимо будет все текстовые строки преобразовывать в UTF8.
Подробнее об этом будет сказано далее, при рассмотрении конкретных примеров. К
сожалению, от этой версии мне не удалось добиться правильного отображения имени
листа, содержащего русские символы. Работа с одной из предыдущих версий 0.43 (несмотря
на значительный разрыв номеров версии, от 2.11 ее отделяет не более года),
реализующей, по всей видимости, формат BIFF7 и использующей стандартную
кодировку Windows, позволяющую сохранять данные в cp1251, никаких проблем ни с
кодировкой данных, ни с кодировкой имени листа не выявила. Но поскольку Unicode
– это, пожалуй, единственное решение проблем различных кодировок, то на пути к
его безраздельному господству придется претерпеть некоторые неудобства.