From f5533df5ea962f9638f2ff3664f74fa8d6ab12c0 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 1 May 2013 14:34:01 -0500 Subject: get row heights and column widths --- lib/Spreadsheet/Template/Generator/Parser/Excel.pm | 7 +++- lib/Spreadsheet/Template/Generator/Parser/XLSX.pm | 43 +++++++++++++++++++++- 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 - -- cgit v1.2.3-54-g00ecf