diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-05-01 12:13:34 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-05-01 12:13:34 -0500 |
commit | 9824fd56633cc3cf4b65aa5c1585805e6fc447f3 (patch) | |
tree | 4295e5077600adb6c7b30945ada3dea4ad477c9e /lib | |
parent | 6739d8c87dda4f543400305d5a06c128ab87492d (diff) | |
download | spreadsheet-template-9824fd56633cc3cf4b65aa5c1585805e6fc447f3.tar.gz spreadsheet-template-9824fd56633cc3cf4b65aa5c1585805e6fc447f3.zip |
support xls files too
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Spreadsheet/Template/Generator/Parser/Excel.pm | 92 | ||||
-rw-r--r-- | lib/Spreadsheet/Template/Generator/Parser/XLS.pm | 22 | ||||
-rw-r--r-- | lib/Spreadsheet/Template/Generator/Parser/XLSX.pm | 80 |
3 files changed, 122 insertions, 72 deletions
diff --git a/lib/Spreadsheet/Template/Generator/Parser/Excel.pm b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm new file mode 100644 index 0000000..4638a8b --- /dev/null +++ b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm @@ -0,0 +1,92 @@ +package Spreadsheet::Template::Generator::Parser::Excel; +use Moose::Role; + +with 'Spreadsheet::Template::Generator::Parser'; + +requires 'make_excel'; + +sub parse { + my $self = shift; + my ($filename) = @_; + + my $excel = $self->make_excel($filename); + return $self->_parse_workbook($excel); + my $data = { + worksheets => [], + }; + for my $sheet ($excel->worksheets) { + push @{ $data->{worksheets} }, $self->_parse + } +} + +sub _parse_workbook { + my $self = shift; + my ($excel) = @_; + + my $data = { + worksheets => [], + }; + + for my $sheet ($excel->worksheets) { + push @{ $data->{worksheets} }, $self->_parse_worksheet($sheet); + } + + return $data; +} + +sub _parse_worksheet { + my $self = shift; + my ($sheet) = @_; + + my $data = { + cells => [], + }; + + my ($rmin, $rmax) = $sheet->row_range; + my ($cmin, $cmax) = $sheet->col_range; + + for my $row (0..$rmin - 1) { + push @{ $data->{cells} }, []; + } + + for my $row ($rmin..$rmax) { + my $row_data = []; + for my $col (0..$cmin - 1) { + push @$row_data, {}; + } + for my $col ($cmin..$cmax) { + if (my $cell = $sheet->get_cell($row, $col)) { + push @$row_data, $self->_parse_cell($cell); + } + else { + push @$row_data, {}; + } + } + push @{ $data->{cells} }, $row_data + } + + return $data; +} + +sub _parse_cell { + my $self = shift; + my ($cell) = @_; + + + my $data = { + contents => $self->_filter_cell_contents($cell->unformatted), + type => $cell->type, + }; + + return $data; +} + +sub _filter_cell_contents { + my $self = shift; + my ($contents) = @_; + return $contents; +} + +no Moose::Role; + +1; diff --git a/lib/Spreadsheet/Template/Generator/Parser/XLS.pm b/lib/Spreadsheet/Template/Generator/Parser/XLS.pm new file mode 100644 index 0000000..a693120 --- /dev/null +++ b/lib/Spreadsheet/Template/Generator/Parser/XLS.pm @@ -0,0 +1,22 @@ +package Spreadsheet::Template::Generator::Parser::XLS; +use Moose; + +use Spreadsheet::ParseExcel; + +with 'Spreadsheet::Template::Generator::Parser::Excel'; + +sub make_excel { + my $self = shift; + my ($filename) = @_; + + my $parser = Spreadsheet::ParseExcel->new; + my $excel = $parser->parse($filename); + die $parser->error unless $excel; + + return $excel; +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm index b542ac3..8e3c29c 100644 --- a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm +++ b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm @@ -1,86 +1,22 @@ package Spreadsheet::Template::Generator::Parser::XLSX; use Moose; -use XML::Entities; use Spreadsheet::XLSX; +use XML::Entities; -with 'Spreadsheet::Template::Generator::Parser'; +with 'Spreadsheet::Template::Generator::Parser::Excel'; -sub parse { +sub make_excel { my $self = shift; my ($filename) = @_; - - my $excel = Spreadsheet::XLSX->new($filename); - return $self->_parse_workbook($excel); - my $data = { - worksheets => [], - }; - for my $sheet ($excel->worksheets) { - push @{ $data->{worksheets} }, $self->_parse - } -} - -sub _parse_workbook { - my $self = shift; - my ($excel) = @_; - - my $data = { - worksheets => [], - }; - - for my $sheet ($excel->worksheets) { - push @{ $data->{worksheets} }, $self->_parse_worksheet($sheet); - } - - return $data; -} - -sub _parse_worksheet { - my $self = shift; - my ($sheet) = @_; - - my $data = { - cells => [], - }; - - my ($rmin, $rmax) = $sheet->row_range; - my ($cmin, $cmax) = $sheet->col_range; - - for my $row (0..$rmin - 1) { - push @{ $data->{cells} }, []; - } - - for my $row ($rmin..$rmax) { - my $row_data = []; - for my $col (0..$cmin - 1) { - push @$row_data, {}; - } - for my $col ($cmin..$cmax) { - if (my $cell = $sheet->get_cell($row, $col)) { - push @$row_data, $self->_parse_cell($cell); - } - else { - push @$row_data, {}; - } - } - push @{ $data->{cells} }, $row_data - } - - return $data; + return Spreadsheet::XLSX->new($filename); } -sub _parse_cell { +sub _filter_cell_contents { my $self = shift; - my ($cell) = @_; - - - my $data = { - # XXX this decode call really feels like a bug in Spreadsheet::XLSX - contents => XML::Entities::decode('all', $cell->unformatted), - type => $cell->type, - }; - - return $data; + my ($contents) = @_; + # XXX this decode call really feels like a bug in Spreadsheet::XLSX + return XML::Entities::decode('all', $contents); } __PACKAGE__->meta->make_immutable; |