summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-05-01 14:34:01 -0500
committerJesse Luehrs <doy@tozt.net>2013-05-01 14:34:01 -0500
commitf5533df5ea962f9638f2ff3664f74fa8d6ab12c0 (patch)
tree0ad9e713cc0196a883f58d8005c26328e7c1fca0
parent9cf7419380a812d1bbacb74018c111a7e77cb5ac (diff)
downloadspreadsheet-template-f5533df5ea962f9638f2ff3664f74fa8d6ab12c0.tar.gz
spreadsheet-template-f5533df5ea962f9638f2ff3664f74fa8d6ab12c0.zip
get row heights and column widths
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/Excel.pm7
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/XLSX.pm43
2 files changed, 48 insertions, 2 deletions
diff --git a/lib/Spreadsheet/Template/Generator/Parser/Excel.pm b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm
index 1aed4a8..76600bf 100644
--- a/lib/Spreadsheet/Template/Generator/Parser/Excel.pm
+++ b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm
@@ -39,12 +39,17 @@ sub _parse_worksheet {
my ($sheet) = @_;
my $data = {
- cells => [],
+ row_heights => [ $sheet->get_row_heights ],
+ column_widths => [ $sheet->get_col_widths ],
+ cells => [],
};
my ($rmin, $rmax) = $sheet->row_range;
my ($cmin, $cmax) = $sheet->col_range;
+ splice @{ $data->{row_heights} }, $rmax + 1;
+ splice @{ $data->{column_widths} }, $cmax + 1;
+
for my $row (0..$rmin - 1) {
push @{ $data->{cells} }, [];
}
diff --git a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm
index 75f8481..e9e8972 100644
--- a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm
+++ b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm
@@ -3,13 +3,54 @@ use Moose;
use Spreadsheet::XLSX;
use XML::Entities;
+use XML::Twig;
with 'Spreadsheet::Template::Generator::Parser::Excel';
sub make_excel {
my $self = shift;
my ($filename) = @_;
- return Spreadsheet::XLSX->new($filename);
+ my $excel = Spreadsheet::XLSX->new($filename);
+
+ # XXX Spreadsheet::XLSX doesn't extract this information currently
+ my $zip = Archive::Zip->new;
+ die "Can't open $filename as zip file"
+ unless $zip->read($filename) == Archive::Zip::AZ_OK;
+
+ for my $sheet ($excel->worksheets) {
+ my $contents = $zip->memberNamed("xl/$sheet->{path}")->contents;
+ next unless $contents;
+
+ my @column_widths;
+ my @row_heights;
+
+ my $xml = XML::Twig->new;
+ $xml->parse($contents);
+ my $root = $xml->root;
+
+ my ($format) = $root->find_nodes('//sheetFormatPr');
+ my $default_row_height = $format->att('defaultRowHeight');
+ my $default_column_width = $format->att('baseColWidth');
+
+ for my $col ($root->find_nodes('//col')) {
+ $column_widths[$col->att('min') - 1] = $col->att('width');
+ }
+
+ for my $row ($root->find_nodes('//row')) {
+ $row_heights[$row->att('r') - 1] = $row->att('ht');
+ }
+
+ $sheet->{DefRowHeight} = $default_row_height;
+ $sheet->{DefColWidth} = $default_column_width;
+ $sheet->{RowHeight} = [
+ map { defined $_ ? $_ : $default_row_height } @row_heights
+ ];
+ $sheet->{ColWidth} = [
+ map { defined $_ ? $_ : $default_column_width } @column_widths
+ ];
+ }
+
+ return $excel;
}
# XXX this stuff all feels like working around bugs in Spreadsheet::XLSX -