summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-05-01 12:13:34 -0500
committerJesse Luehrs <doy@tozt.net>2013-05-01 12:13:34 -0500
commit9824fd56633cc3cf4b65aa5c1585805e6fc447f3 (patch)
tree4295e5077600adb6c7b30945ada3dea4ad477c9e
parent6739d8c87dda4f543400305d5a06c128ab87492d (diff)
downloadspreadsheet-template-9824fd56633cc3cf4b65aa5c1585805e6fc447f3.tar.gz
spreadsheet-template-9824fd56633cc3cf4b65aa5c1585805e6fc447f3.zip
support xls files too
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/Excel.pm92
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/XLS.pm22
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/XLSX.pm80
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;