Subject: | Spreadsheet::ParseExcel::Simple mod allowing for obtaining unformatted values from the next_row |
Date: | Fri, 24 Nov 2006 11:08:21 -0500 |
To: | bug-Spreadsheet-ParseExcel-Simple [...] rt.cpan.org |
From: | Chris Hagglund <chagglund [...] shrinkingplanet.ca> |
Just passing this along in case you or your users are interested. I made
this mod b/c our client likes to send us xls files to load into the db
but with all kind of stupid formatting applied that makes us need to
access unformatted values for some fields. Since I was using your module
already I figured I could just modify it to allow for that. The changes
seem to work properly, though it might blow up if the new arguments are
specified incorrectly. Meh, works for me :) though maybe it moves things
slightly out of the realm of "Simple".
- Chris.
Your original:
sub next_row {
map { $_ ? $_->Value : "" } @{$_[0]->{sheet}->{Cells}[$_[0]->{row}++]};
}
My modification:
sub next_row {
my $cc = 0; #cellcount
map { $cc++; $_ ? ((defined($_[1]) && (($_[1]->{Val} &&
$_[1]->{Val}->{$cc-1}) || $_[1]->{AllAsVal})) ? $_->{Val} : $_->Value) :
"" } @{$_[0]->{sheet}->{Cells}[$_[0]->{row}++]};
}
With added documentation:
Now with the ability to get the next_row but with base values instead of
formatted values.
By default, it will still obtain all formatted values. But now you can
pass a hashref as an argument to next_row and depending what you ask for
either get certain cells back unformatted, or get all the cells back
unformatted.
For regular old behavior, nothing changes and you call it like:
my @data = $sheet->next_row();
To ask for just cells 3 and 7 to be unformatted (counting from 0),
calling it like this will do the job:
my @data = $sheet->next_row({Val=>{3=>1,7=>1}});
To ask for all of the cells to be unformatted:
my @data = $sheet->next_row({AllAsVal=>1});