S3.Blog

22 Октября 2017
A A A   RSS-лента
"Я знаю, что ничего не знаю, но многие не знают и этого". Сократ [?].

Perl: Создание Excel-документа с помощью XML

Дата последнего изменения: 7 Мая 2010
Метки статьи: Документация, Perl
Документация в Excel очень удобна для менеджеров и бухгалтеров, поэтому практически в любом корпоративном проекте есть кнопка "экспортировать в Excel". Для создания красивого excel-документа, средствами perl, существует удобный модуль Excel::Template, создающий xls на основе xml-шаблонов.
 

Для тех, кто знаком с HTML::Template, будет приятно узнать что синтаксис команд Excel::Template практически такой-же, за исключением некоторых моментов.

Далее я приведу небольшой пример использования Excel::Template, генерирующий xls со списком пользователей.

perl-скрипт
#!/usr/bin/perl -w
use strict;

use Excel::Template;

#------------------------------------
#-- формируем массив с пользователями
#------------------------------------
my $users = [ { user_name => 'Василий', user_age => '25', user_sex => 'Male' }, { user_name => 'Оксана', user_age => '34', user_sex => 'Female' }, { user_name => 'Андрей', user_age => '29', user_sex => 'Male' }, ]; #------------------------------------
#-- формирование excel отчета по xml-шаблону и данным
#------------------------------------
my $template_file = 'users.xml'; my $excel_file = 'users.xls'; my $template = Excel::Template->new( filename => $template_file ); $template->param( users_data => $users ); $template->write_file($excel_file);
xml-шаблон (users.xml)
<?xml version="1.0" encoding="UTF-8"?>
<workbook>
	<worksheet name="$leaders_date">
		<format valign="vcenter" bold="bold" bg_color="orange">
		<row>
			<cell width="33">Имя</cell>
			<cell width="20">Пол</cell>
			<cell width="20">Возраст</cell>
		</row>
		</format>

		<loop name="users_data">
		<row>
			<cell><var name="user_name"/></cell>
			<cell><var name="user_sex"/></cell>
			<cell type="number"><var name="user_age"/></cell>
		</row>
		</loop>
	</worksheet>
</workbook>

Вот, собственно, и вся кухня.
Подробнее про Excel::Template вы можете прочитать на сайте cpan.org: http://search.cpan.org/perldoc?Excel::Template
Еще пример построения XLS на основе XML можно посмотреть здесь: Генерация Excel документов на perl


UPD:

Долго боролся с кодировками, пока не нашел решение проблемы на страницах ЖЖ товарища mollenhauer: Excel::Template, проблема с кодировкой, а точнее с utf-8

Далее цитирую:
Excel::Template, проблема с кодировкой, а точнее с utf-8
У меня есть форма на странице (все в utf-8), из данных этой формы планируется формировать excel файл, на основе шаблона.
Решил для этого юзать Excel::Template, так как на мой взгляд наиболее подходящий: файл формирую по шаблону в xml, (да и по бенчмарку по заявлениям авторов довольно быстрый). Но вот одна странная проблема,  на основании вот такого вот шаблона:
<?xml version="1.0" encoding="UTF-8"?>
  <workbook>
  <worksheet name="client">
  <cell text="Наименование организации:" />
  <cell text="$name" />
  </worksheet>
  </workbook>

Формирует вот такой вот файл:



При этом раскодируется через тот же Shtirlitz вот эта абракадабра в правой ячейке без проблем...
У кого-нибудь был опыт создания excel из web-форм?


В ходе обсуждения проблемы товарищ a_lourier подсказал решение:
Сделайте:
$name = Encode::decode_utf8($name);
 


Похожие материалы:




rus (гость) • ответить
Так тоже отлично работает!

use Encode;
use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.CP1251');
setlocale(LC_ALL, 'ru_RU.CP1251');

$rezult = Encode::decode('cp1251', $name);
Viktor (гость) • ответить
Просто необычайно огромная благодарность за статью!!!
Все легко и красиво

 
 
  Имя *:   Решите пример *: =
 
Полужирный Курсив Подчеркнутый Перечеркнутый
 
Вставить изображение Сделать цитатой Вставить ссылку Вставить код

Вставить смайл
 
 

 



© S3.Blog: Если критикуешь, не предлагая решения проблемы, то ты становишься частью этой проблемы.