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/XLSX.pm | 43 ++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'lib/Spreadsheet/Template/Generator/Parser/XLSX.pm') 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