diff options
Diffstat (limited to 'lib/Spreadsheet/Template/Generator/Parser/Excel.pm')
-rw-r--r-- | lib/Spreadsheet/Template/Generator/Parser/Excel.pm | 92 |
1 files changed, 92 insertions, 0 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; |