Создание Excel документов с помощью Perl, с графиками и форматированием

Целью данной статьи является помощь тем, кому необходимо сгенерировать Excel документ, а также построить в нем график по нужным столбцам, познакомиться со способами форматирования текста, вывода формул и русских надписей при помощи скриптового языка Perl.

К примеру, необходимо из БД MYSQL, в которой содержится информация об отелях и их рейтинге, вывести в документ имена этих отелей с их рейтингом и построить график , по полученным столбцам, сделать форматированную шапку для столбцов из русского текста.

Сделать это можно следующим образом:
1. Подготовить бинарный файл-подложку, для отображения графиков в Excel (если Вам интересно просто создание Excel файлов без графиков можете сразу начинать со второго пункта).
2. Вставить ссылку на этот файл непосредственно в программе скрипте, которая нам сгенерирует не просто заполненный Excel, но и график по необходимым.

1. Реализуем бинарный файл-подложку для последующего графика Excel документа.

1. Для вставки в Excel не только данных, но и графиков необходимо подготовить шаблон - бинарный файл. По-другому пока perl генерировать Excel документы с графиками не может, об этом можно прочитать здесь. Т.е. функция для вставки графика использует заранее подготовленный бинарник.
Для начала готовим Excel файл с настроенным графиком( в примере используется файл указанный здесь).
Для этого располагаем в нем два столбца (или столько сколько необходимо) в том же положении, в котором потом они будут в конечном файле и набираем их тестовыми данными , как показано ниже:

Располагаем график и ссылаемся в нем на эти столбцы. Настраиваем цвет и тип графика. При этом в самом графике, например в заголовке, могут использоваться русские названия.
График может быть таким:

Сохраняем файл.

2. Устанавливаем модуль для работы с Excel:

cpan[1]> make install clean Spreadsheet::WriteExcel

3. После распаковки модуля Spreadsheet-WriteExcel-2.26 в папке charts вызываем команду для полученного Excel файла:

# chartex -c mychart article.xls

Так мы получили бинарник mychart01.bin подоснову для Excel документа с графиком.

2. Теперь работаем непосредственно в скрипте для генерации конечного Excel документа.

1. Создаем Excel файл

my $workbook = Spreadsheet::WriteExcel->new("/home/masha/ExampleExcel_with_Chart.xls");

2. Подключаемся к файлу хранящему шаблон слов для шапки и для имен листов. Делаем шапку из русских, форматированных слов. Их надо хранить в отдельном файле в формате utf8.
Здесь располагается куча комбинаций, примеров и разных кодировок и разных языков /root/.cpan/build/Spreadsheet-WriteExcel-2.26/examples

my $file = '/home/masha/article_pattern.txt';
open FH, '<:encoding(utf8)', $file or die "Couldn't open $file: $!\n";

Считываем данные в массив:

while (<FH>) {
    next if /^#/; # Ignore the comments in the sample file.
    chomp;
    push(@array,$_);
}

3. Создаем первый лист и указываем имя листа:

my $worksheet1=$workbook->add_worksheet('Hotels_Rating');

Имя листа необходимо задавать по-английски, т.к. именно в данном примере с графиком он используется в функции store_formula() и не может быть русским. В целом можно создавать Excel файлы с листами на русском языке.

4. Создаем формат вывода текста в ячейках таблицы: по-центру, жирным, подчеркнутым и т.д. И заполним пару ячеек с помощью этого формата текстом на русском языке из шаблонного файла:

my $format = $workbook->add_format(valign=>'vcenter',align=>'left');
$format->set_bold();
$format->set_underline();
$worksheet1->write('B1',$array[0],$format);
$worksheet1->write('C1',$array[1],$format);
$worksheet1->write('B6',$array[2],$format);

5. Делаем выборку из базы:

my $dbh=DBI->connect('dbi:mysql:example:localhost', 'root', '') or die "Can't connect";
my $sth=$dbh->prepare('SELECT * FROM hotels;');
$sth->execute();

6. Сохраняем полученные данные в столбцы документа и отключаемся от базы:

my $rows = $dbh->selectall_arrayref($sth);
$worksheet1->select();
$worksheet1->write_col('B2',$rows);
$sth->finish();
$dbh->disconnect();

7. Добавляем график:

my $chart = $worksheet1->embed_chart('B9','/home/masha/mychart01.bin');
$worksheet1->store_formula("=Hotels_Rating!A1");

Функция store_formula - позволяет пересчитать данные на графике заново в зависимости от текущих в документе Excel

8. Сохраняем Excel

$workbook->close();

После выполнения скрипта получаем долгожданный Excel документ :

Исходный текст программы: createxls_charts.pl.
Пример Excel документа с графиком: article.xls.
Шаблон с русскими именами для заголовков столбцов: article_pattern.txt.
Bin файл полученный из article.xls как описано выше: mychart01.bin.