use Excel::Template::Base;
use vars qw ($VERSION @ISA);
- $VERSION = '0.22';
+ $VERSION = '0.26';
@ISA = qw( Excel::Template::Base );
}
my $self = shift;
# Allow an arbitrary number of hashrefs, so long as they're the first things # into param(). Put each one onto the end, de-referenced.
- push @_, %{shift @_} while UNIVERSAL::isa($_[0], 'HASH');
+ push @_, %{shift @_} while ref $_[0] eq 'HASH';
(@_ % 2)
&& die __PACKAGE__, "->param() : Odd number of parameters to param()\n";
my $xls = $self->{RENDERER}->new($filename)
|| die "Cannot create XLS in '$filename': $!\n";
- $self->_prepare_output($xls);
+ eval {
+ $self->_prepare_output($xls);
+ };
+print $@ if $@;
$xls->close;
+ return if $@;
+
return ~~1;
}
my $output;
tie *XLS, 'IO::Scalar', \$output;
- $self->write_file(\*XLS);
+ $self->write_file(\*XLS)
+ or return;
return $output;
}
if ( $node->isa( 'WORKBOOK' ) )
{
- push @{$self->{WORKBOOKS}}, $node;
+ $self->{WORKBOOK} = $node;
}
elsif ( $node->is_embedded )
{
push @parms, Base => $dirname;
- open( INFILE, "<$file" )
- || die "Cannot open '$file' for reading: $!\n";
-
+ eval q{
+ open( INFILE, '<', $file )
+ || die "Cannot open '$file' for reading: $!\n";
+ }; if ( $@ ) {
+ if ( $@ =~ /Too many arguments for open/ ) {
+ open( INFILE, "< $file" )
+ || die "Cannot open '$file' for reading: $!\n";
+ } else {
+ die $@;
+ }
+ }
}
my $parser = XML::Parser->new( @parms );
$parser->parse(do { local $/ = undef; <INFILE> });
- unless ( ref $file )
- {
- close INFILE;
- }
+ close INFILE
+ unless ref $file;
return ~~1;
}
-*parse = \&parse_xml;
+*parse = *parse = \&parse_xml;
sub _prepare_output
{
my $self = shift;
+ return unless $self->{WORKBOOK};
+
my ($xls) = @_;
my $context = Excel::Template::Factory->_create(
UNICODE => $self->{UNICODE},
);
-# print "@{$self->{WORKBOOKS}}\n";
- $_->render($context) for @{$self->{WORKBOOKS}};
+ $self->{WORKBOOK}->render($context);
return ~~1;
}
-sub register { shift; Excel::Template::Factory::register(@_) }
+sub register { shift; Excel::Template::Factory->register(@_) }
1;
__END__
<workbook>
<worksheet name="tester">
- <cell text="$HOME"/>
- <cell text="$PATH"/>
+ <cell text="$HOME" />
+ <cell text="$PATH" />
</worksheet>
</workbook>
Now, create a small program to use it:
#!/usr/bin/perl -w
+
+ use strict;
+
use Excel::Template;
# Create the Excel template
$template->write_file('test.xls');
-If everything worked, then you should have a spreadsheet in your work directory
-that looks something like:
+If everything worked, then you should have a spreadsheet called text.xls in your working directory that looks something like:
A B C
+----------------+----------------+----------------
=head1 DESCRIPTION
-This is a module used for templating Excel files. Its genesis came from the
-need to use the same datastructure as HTML::Template, but provide Excel files
-instead. The existing modules don't do the trick, as they require replication
-of logic that's already been done within HTML::Template.
+This is a module used for templating Excel files. Its genesis came from the need to use the same datastructure as L<HTML::Template>, but provide Excel files instead. The existing modules don't do the trick, as they require replication of logic that's already been done within L<HTML::Template>.
=head1 MOTIVATION
-I do a lot of Perl/CGI for reporting purposes. In nearly every place I've been,
-I've been asked for HTML, PDF, and Excel. HTML::Template provides the first, and
-PDF::Template does the second pretty well. But, generating Excel was the
-sticking point. I already had the data structure for the other templating
-modules, but I just didn't have an easy mechanism to get that data structure
-into an XLS file.
+I do a lot of Perl/CGI for reporting purposes. In nearly every place I've been, I've been asked for HTML, PDF, and Excel. L<HTML::Template> provides the first, and L<PDF::Template> does the second pretty well. But, generating Excel was the sticking point. I already had the data structure for the other templating modules, but I just didn't have an easy mechanism to get that data structure into an XLS file.
=head1 USAGE
=item * RENDERER
-The default rendering engine is Spreadsheet::WriteExcel. You may, if you choose, change that to another choice. The legal values are:
+The default rendering engine is L<Spreadsheet::WriteExcel>. You may, if you choose, change that to another choice. The legal values are:
=over 4
=item * Excel::Template->RENDER_NML
-This is the default of Spreadsheet::WriteExcel.
+This is the default of L<Spreadsheet::WriteExcel>.
=item * Excel::Template->RENDER_BIG
-This attempts to load Spreadsheet::WriteExcel::Big.
+This attempts to load L<Spreadsheet::WriteExcel::Big>.
=item * Excel::Template->RENDER_XML
-This attempts to load Spreadsheet::WriteExcelXML.
+This attempts to load L<Spreadsheet::WriteExcelXML>.
=back
This will use L<Unicode::String> to represent strings instead of Perl's internal string handling. You must already have L<Unicode::String> installed on your system.
-The USE_UNICODE parameter will be ignored if you are using Perl 5.8 or higher as
-Perl's internal string handling is unicode-aware.
+The USE_UNICODE parameter will be ignored if you are using Perl 5.8 or higher as Perl's internal string handling is unicode-aware.
-NOTE: Certain older versions of L<OLE::Storage_Lite> and mod_perl clash for some
-reason. Upgrading to the latest version of L<OLE::Storage_Lite> should fix the
-problem.
+NOTE: Certain older versions of L<OLE::Storage_Lite> and mod_perl clash for some reason. Upgrading to the latest version of L<OLE::Storage_Lite> should fix the problem.
=back
This method actually parses the template file. It can either be called separately or through the new() call. It will die() if it runs into a situation it cannot handle.
-If a filename is passed in (vs. a filehandle), the directory name will be passed in to XML::Parser as the I<Base> parameter. This will allow for XML directives to work as expected.
+If a filename is passed in (vs. a filehandle), the directory name will be passed in to L<XML::Parser> as the I<Base> parameter. This will allow for XML directives to work as expected.
=head2 write_file()
-Create the Excel file and write it to the specified filename, if possible. (This
-is when the actual merging of the template and the parameters occurs.)
+Create the Excel file and write it to the specified filename, if possible. (This is when the actual merging of the template and the parameters occurs.)
=head2 output()
-It will act just like HTML::Template's output() method, returning the resultant
-file as a stream, usually for output to the web. (This is when the actual
-merging of the template and the parameters occurs.)
+It will act just like L<HTML::Template>'s output() method, returning the resultant file as a stream, usually for output to the web. (This is when the actual merging of the template and the parameters occurs.)
=head2 register()
=head1 SUPPORTED NODES
-This is a partial list of nodes. See the other classes in this distro for more
-details on specific parameters and the like.
+This is a partial list of nodes. See the other classes in this distro for more details on specific parameters and the like.
-Every node can set the ROW and COL parameters. These are the actual ROW/COL
-values that the next CELL-type tag will write into.
+Every node can set the ROW and COL parameters. These are the actual ROW/COL values that the next CELL-type tag will write into.
=over 4
=item * L<WORKBOOK|Excel::Template::Container::Workbook>
-This is the node representing the workbook. It is the parent for all other
-nodes.
+This is the node representing the workbook. It is the parent for all other nodes.
=item * L<WORKSHEET|Excel::Template::Container::Worksheet>
=item * L<IF|Excel::Template::Container::Conditional>
-This node represents a conditional expression. Its children may or may not be
-rendered. It behaves just like L<HTML::Template>'s TMPL_IF.
+This node represents a conditional expression. Its children may or may not be rendered. It behaves just like L<HTML::Template>'s TMPL_IF.
=item * L<LOOP|Excel::Template::Container::Loop>
=item * L<ROW|Excel::Template::Container::Row>
-This node represents a row of data. This is the A in A1.
+This node represents a row of data. This is the 1 in A1. There is no COLUMN node, as of yet.
=item * L<FORMAT|Excel::Template::Container::Format>
-This node varies the format for its children. All formatting options supported
-in L<Spreadsheet::WriteExcel> are supported here. There are also a number of
-formatting shortcuts, such as L<BOLD|Excel::Template::Container::Bold> and
-L<ITALIC|Excel::Template::Container::Italic>.
+This node varies the format for its children. All formatting options supported in L<Spreadsheet::WriteExcel> are supported here. There are also a number of formatting shortcuts, such as L<BOLD|Excel::Template::Container::Bold> and L<ITALIC|Excel::Template::Container::Italic>.
=item * L<BACKREF|Excel::Template::Element::Backref>
=head1 SUPPORT
-This is production quality software, used in several production web
-applications.
+This is production quality software, used in several production web applications.
=head1 AUTHOR
=head1 TEST COVERAGE
-I used Devel::Cover to test the coverage of my tests. Every release, I intend to improve these numbers.
+I use L<Devel::Cover> to test the coverage of my tests. Every release, I intend to improve these numbers.
Excel::Template is also part of the CPAN Kwalitee initiative, being one of the top 100 non-core modules downloaded from CPAN. If you wish to help out, please feel free to contribute tests, patches, and/or suggestions.
----------------------------- ------ ------ ------ ------ ------ ------ ------
-File stmt branch cond sub pod time total
----------------------------- ------ ------ ------ ------ ------ ------ ------
-blib/lib/Excel/Template.pm 90.4 62.5 58.8 90.5 100.0 30.2 82.0
-...ib/Excel/Template/Base.pm 83.3 50.0 66.7 75.0 88.9 8.2 80.0
-...cel/Template/Container.pm 46.3 20.0 33.3 58.3 85.7 4.6 47.7
-...emplate/Container/Bold.pm 100.0 n/a n/a 100.0 0.0 0.5 95.0
-.../Container/Conditional.pm 58.5 52.3 66.7 75.0 66.7 0.8 58.4
-...plate/Container/Format.pm 100.0 n/a n/a 100.0 0.0 0.7 96.6
-...plate/Container/Hidden.pm 100.0 n/a n/a 100.0 0.0 0.2 95.0
-...plate/Container/Italic.pm 100.0 n/a n/a 100.0 0.0 0.1 95.0
-...plate/Container/Locked.pm 100.0 n/a n/a 100.0 0.0 0.1 95.0
-...emplate/Container/Loop.pm 55.6 40.0 50.0 77.8 75.0 0.5 56.6
-...late/Container/Outline.pm 71.4 n/a n/a 80.0 0.0 0.0 70.0
-...Template/Container/Row.pm 100.0 75.0 n/a 100.0 50.0 0.3 93.8
-...mplate/Container/Scope.pm 100.0 n/a n/a 100.0 n/a 0.1 100.0
-...plate/Container/Shadow.pm 100.0 n/a n/a 100.0 0.0 0.1 95.0
-...te/Container/Strikeout.pm 100.0 n/a n/a 100.0 0.0 0.1 95.0
-...ate/Container/Workbook.pm 100.0 n/a n/a 100.0 n/a 1.0 100.0
-...te/Container/Worksheet.pm 94.1 50.0 n/a 100.0 0.0 0.9 88.0
-...Excel/Template/Context.pm 83.1 53.4 54.2 95.0 92.9 19.1 75.2
-...Excel/Template/Element.pm 100.0 n/a n/a 100.0 n/a 0.4 100.0
-...mplate/Element/Backref.pm 100.0 50.0 33.3 100.0 0.0 0.1 87.1
-.../Template/Element/Cell.pm 95.8 65.0 80.0 100.0 66.7 3.6 86.9
-...mplate/Element/Formula.pm 100.0 n/a n/a 100.0 0.0 0.3 94.1
-...Template/Element/Range.pm 100.0 66.7 n/a 100.0 66.7 0.2 93.3
-...l/Template/Element/Var.pm 100.0 n/a n/a 100.0 0.0 0.1 94.1
-...Excel/Template/Factory.pm 57.1 34.6 n/a 88.9 100.0 14.3 55.2
-.../Excel/Template/Format.pm 98.3 81.2 33.3 100.0 100.0 8.9 93.2
-...xcel/Template/Iterator.pm 85.2 70.6 70.6 84.6 87.5 1.9 80.4
-...el/Template/TextObject.pm 92.9 62.5 33.3 100.0 50.0 2.7 83.0
-Total 83.1 56.6 58.3 91.1 98.7 100.0 78.8
----------------------------- ------ ------ ------ ------ ------ ------ ------
+ ---------------------------- ------ ------ ------ ------ ------ ------ ------
+ File stmt bran cond sub pod time total
+ ---------------------------- ------ ------ ------ ------ ------ ------ ------
+ blib/lib/Excel/Template.pm 93.8 60.0 58.8 100.0 100.0 24.6 83.3
+ ...ib/Excel/Template/Base.pm 94.4 50.0 n/a 100.0 0.0 7.0 80.0
+ ...cel/Template/Container.pm 100.0 50.0 33.3 100.0 0.0 4.1 83.3
+ ...emplate/Container/Bold.pm 100.0 n/a n/a 100.0 0.0 0.3 95.0
+ .../Container/Conditional.pm 95.9 90.0 66.7 100.0 0.0 1.2 91.0
+ ...plate/Container/Format.pm 100.0 n/a n/a 100.0 0.0 0.5 96.6
+ ...plate/Container/Hidden.pm 100.0 n/a n/a 100.0 0.0 0.0 95.0
+ ...plate/Container/Italic.pm 100.0 n/a n/a 100.0 0.0 0.1 95.0
+ ...ainer/KeepLeadingZeros.pm 100.0 100.0 n/a 100.0 0.0 0.1 96.3
+ ...plate/Container/Locked.pm 100.0 n/a n/a 100.0 0.0 0.0 95.0
+ ...emplate/Container/Loop.pm 96.8 50.0 50.0 100.0 0.0 0.3 82.7
+ ...late/Container/Outline.pm 100.0 n/a n/a 100.0 0.0 0.0 95.0
+ ...Template/Container/Row.pm 100.0 75.0 n/a 100.0 0.0 0.2 90.6
+ ...mplate/Container/Scope.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
+ ...plate/Container/Shadow.pm 100.0 n/a n/a 100.0 0.0 0.0 95.0
+ ...te/Container/Strikeout.pm 100.0 n/a n/a 100.0 0.0 0.0 95.0
+ ...ate/Container/Workbook.pm 100.0 n/a n/a 100.0 n/a 2.6 100.0
+ ...te/Container/Worksheet.pm 94.7 75.0 n/a 100.0 0.0 1.0 87.1
+ ...Excel/Template/Context.pm 98.0 80.0 75.0 100.0 73.3 21.4 90.7
+ ...Excel/Template/Element.pm 100.0 n/a n/a 100.0 n/a 0.3 100.0
+ ...mplate/Element/Backref.pm 100.0 50.0 33.3 100.0 0.0 0.4 87.1
+ .../Template/Element/Cell.pm 97.9 75.0 80.0 100.0 0.0 3.5 88.6
+ ...mplate/Element/Formula.pm 100.0 n/a n/a 100.0 0.0 0.2 94.1
+ ...te/Element/FreezePanes.pm 100.0 n/a n/a 100.0 0.0 0.0 95.5
+ ...Template/Element/Image.pm 100.0 100.0 n/a 100.0 0.0 0.1 94.3
+ ...Template/Element/Range.pm 100.0 66.7 n/a 100.0 0.0 0.1 88.9
+ ...l/Template/Element/Var.pm 100.0 n/a n/a 100.0 0.0 0.0 94.1
+ ...Excel/Template/Factory.pm 100.0 73.1 66.7 100.0 100.0 23.5 91.4
+ .../Excel/Template/Format.pm 98.4 75.0 33.3 100.0 66.7 5.4 90.5
+ ...xcel/Template/Iterator.pm 98.6 80.0 70.6 100.0 50.0 1.1 88.8
+ ...el/Template/TextObject.pm 92.9 62.5 33.3 100.0 0.0 1.8 80.9
+ Total 97.8 74.3 63.5 100.0 35.7 100.0 89.4
+ ---------------------------- ------ ------ ------ ------ ------ ------ ------
=head1 COPYRIGHT
-This program is free software; you can redistribute
-it and/or modify it under the same terms as Perl itself.
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
-The full text of the license can be found in the
-LICENSE file included with this module.
+The full text of the license can be found in the LICENSE file included with this module.
=head1 SEE ALSO
-perl(1), HTML::Template, Spreadsheet::WriteExcel.
+perl(1), L<HTML::Template>, L<Spreadsheet::WriteExcel>
=cut