This is an automated email from the git hooks/post-receive script. gregoa pushed a commit to branch master in repository libspreadsheet-xlsx-perl.
commit 3fb0bb1c6f7cc26c7be6f77178f980fc9f903c13 Author: gregor herrmann <gre...@debian.org> Date: Mon Nov 9 19:22:30 2015 +0100 Imported Upstream version 0.15 --- Changes | 11 +- MANIFEST | 11 +- META.json | 44 ++ META.yml | 25 + Makefile.PL | 8 +- README | 4 +- lib/Spreadsheet/XLSX.pm | 449 +++++++------ lib/Spreadsheet/XLSX/Fmt2007.pm | 85 ++- lib/Spreadsheet/XLSX/Utility2007.pm | 1214 +++++++++++++++++------------------ t/1_____loreyna126.t | 36 +- t/2_____with_chart.t | 42 +- t/empty_v_tag.t | 13 + t/empty_v_tag.xlsx | Bin 0 -> 12714 bytes t/formats.t | 24 + t/formats.xlsx | Bin 0 -> 11570 bytes t/kwalitee.t | 9 + t/missing_styles.t | 13 + t/missing_styles.xlsx | Bin 0 -> 6546 bytes 18 files changed, 1063 insertions(+), 925 deletions(-) diff --git a/Changes b/Changes index f7e11cf..255b4fd 100755 --- a/Changes +++ b/Changes @@ -1,5 +1,14 @@ Revision history for Perl extension Spreadsheet::XLSX. +0.15 + + - revert a numeric formatting change which caused isssues with Spreadsheet::Read. + +0.14 + + - change default date format to yyyy-mm-dd. This matches Spreadsheet::ParseExcel. + - handle xml tag attributes in varying order (RT #86667, et.al.) + 0.13 Sun May 16 13:08:12 MSD 2010 - ability to read xlsx from filehandle (RT #57483, thanks Sergey Pushkin) @@ -63,4 +72,4 @@ Revision history for Perl extension Spreadsheet::XLSX. -A -X -n Spreadsheet::XLSC --skip-exporter --skip-autoloader - \ No newline at end of file + diff --git a/MANIFEST b/MANIFEST old mode 100755 new mode 100644 index 7b84047..725cefa --- a/MANIFEST +++ b/MANIFEST @@ -4,10 +4,19 @@ lib/Spreadsheet/XLSX/Fmt2007.pm lib/Spreadsheet/XLSX/Utility2007.pm Makefile.PL MANIFEST This list of files +META.yml Module meta-data (added by MakeMaker) README +Spreadsheet-XLSX-0.14.tar.gz t/0____________use.t t/1_____loreyna126.t t/1_____loreyna126.xlsx t/2_____with_chart.t t/2_____with_chart.xlsx -META.yml Module meta-data (added by MakeMaker) +t/empty_v_tag.t +t/empty_v_tag.xlsx +t/formats.t +t/formats.xlsx +t/kwalitee.t +t/missing_styles.t +t/missing_styles.xlsx +META.json Module JSON meta-data (added by MakeMaker) diff --git a/META.json b/META.json new file mode 100644 index 0000000..84a8187 --- /dev/null +++ b/META.json @@ -0,0 +1,44 @@ +{ + "abstract" : "Perl extension for reading MS Excel 2007 files;", + "author" : [ + "Dmitry Ovsyanko <d...@eludia.ru>", + "Mike Blackwell <mike.blackw...@rrd.com" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 7.04, CPAN::Meta::Converter version 2.150001", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Spreadsheet-XLSX", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "requires" : { + "Archive::Zip" : "1.18", + "Spreadsheet::ParseExcel" : "0", + "Test::NoWarnings" : "0" + } + } + }, + "release_status" : "stable", + "version" : "0.15" +} diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..63cc749 --- /dev/null +++ b/META.yml @@ -0,0 +1,25 @@ +--- +abstract: 'Perl extension for reading MS Excel 2007 files;' +author: + - 'Dmitry Ovsyanko <d...@eludia.ru>' + - 'Mike Blackwell <mike.blackw...@rrd.com' +build_requires: + ExtUtils::MakeMaker: '0' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 7.04, CPAN::Meta::Converter version 2.150001' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: Spreadsheet-XLSX +no_index: + directory: + - t + - inc +requires: + Archive::Zip: '1.18' + Spreadsheet::ParseExcel: '0' + Test::NoWarnings: '0' +version: '0.15' diff --git a/Makefile.PL b/Makefile.PL index ba6fb51..e450386 100755 --- a/Makefile.PL +++ b/Makefile.PL @@ -5,11 +5,13 @@ use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Spreadsheet::XLSX', VERSION_FROM => 'lib/Spreadsheet/XLSX.pm', # finds $VERSION + LICENSE => 'perl_5', PREREQ_PM => { 'Archive::Zip' => 1.18, - 'Spreadsheet::ParseExcel' => '', - }, # e.g., Module::Name => 1.1 + 'Spreadsheet::ParseExcel' => 0, + 'Test::NoWarnings' => 0, + }, ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/Spreadsheet/XLSX.pm', # retrieve abstract from module - AUTHOR => 'Dmitry Ovsyanko <d...@eludia.ru>') : ()), + AUTHOR => ['Dmitry Ovsyanko <d...@eludia.ru>','Mike Blackwell <mike.blackw...@rrd.com']) : ()), ); diff --git a/README b/README index bb6b493..24faef5 100755 --- a/README +++ b/README @@ -1,5 +1,5 @@ -Spreadsheet-XLSC version 0.01 -============================= +Spreadsheet-XLSX +================ Spreadsheet::XLSX - Perl extension for reading MS Excel 2007 files; diff --git a/lib/Spreadsheet/XLSX.pm b/lib/Spreadsheet/XLSX.pm index 8731fca..84bf974 100755 --- a/lib/Spreadsheet/XLSX.pm +++ b/lib/Spreadsheet/XLSX.pm @@ -4,230 +4,285 @@ use 5.006000; use strict; use warnings; -our @ISA = qw(); +use base 'Spreadsheet::ParseExcel::Workbook'; -our $VERSION = '0.13'; +our $VERSION = '0.15'; use Archive::Zip; -use Spreadsheet::XLSX::Fmt2007; -use Data::Dumper; use Spreadsheet::ParseExcel; +use Spreadsheet::XLSX::Fmt2007; ################################################################################ sub new { + my ($class, $filename, $converter) = @_; - my ($class, $filename, $converter) = @_; - - my $self = {}; - - $self -> {zip} = Archive::Zip -> new (); + my %shared_info; # shared_strings, styles, style_info, rels, converter + $shared_info{converter} = $converter; + + my $self = bless Spreadsheet::ParseExcel::Workbook->new(), $class; - if (ref $filename) { - - $self -> {zip} -> readFromFileHandle ($filename) == Archive::Zip::AZ_OK or die ("Cannot open data as Zip archive"); - - } - else { - - $self -> {zip} -> read ($filename) == Archive::Zip::AZ_OK or die ("Cannot open $filename as Zip archive"); - - }; + my $zip = __load_zip($filename); - my $member_shared_strings = $self -> {zip} -> memberNamed ('xl/sharedStrings.xml'); - - my @shared_strings = (); + $shared_info{shared_strings}= __load_shared_strings($zip, $shared_info{converter}); + my ($styles, $style_info) = __load_styles($zip); + $shared_info{styles} = $styles; + $shared_info{style_info} = $style_info; + $shared_info{rels} = __load_rels($zip); - if ($member_shared_strings) { - - my $mstr = $member_shared_strings->contents; - $mstr =~ s/<t\/>/<t><\/t>/gsm; # this handles an empty t tag in the xml <t/> - foreach my $si ($mstr =~ /<si.*?>(.*?)<\/si/gsm) { - my $str; - foreach my $t ($si =~ /<t.*?>(.*?)<\/t/gsm) { - $t = $converter -> convert ($t) if $converter; - $str .= $t; - } - push @shared_strings, $str; - } - } - my $member_styles = $self -> {zip} -> memberNamed ('xl/styles.xml'); + $self->_load_workbook($zip, \%shared_info); + + return $self; +} - my @styles = (); +sub _load_workbook { + my ($self, $zip, $shared_info) = @_; - my %style_info = (); + my $member_workbook = $zip->memberNamed('xl/workbook.xml') or die("xl/workbook.xml not found in this zip\n"); + $self->{SheetCount} = 0; + $self->{FmtClass} = Spreadsheet::XLSX::Fmt2007->new; + $self->{Flg1904} = 0; + if ($member_workbook->contents =~ /date1904="1"/) { + $self->{Flg1904} = 1; + } - if ($member_styles) { + foreach ($member_workbook->contents =~ /\<(.*?)\/?\>/g) { - foreach my $t ($member_styles -> contents =~ /xf\ numFmtId="([^"]*)"(?!.*\/cellStyleXfs)/gsm) { #" - # $t = $converter -> convert ($t) if $converter; - push @styles, $t; + /^(\w+)\s+/; + + my ($tag, $other) = ($1, $'); + + my @pairs = split /\" /, $other; + + $tag eq 'sheet' or next; + + my $sheet = { + MaxRow => 0, + MaxCol => 0, + MinRow => 1000000, + MinCol => 1000000, + }; + + foreach ($other =~ /(\S+=".*?")/gsm) { + + my ($k, $v) = split /=?"/; #" + + if ($k eq 'name') { + $sheet->{Name} = $v; + $sheet->{Name} = $shared_info->{converter}->convert($sheet->{Name}) if defined $shared_info->{converter}; + } elsif ($k eq 'r:id') { + + $sheet->{path} = $shared_info->{rels}->{$v}; + + } + + } + my $wsheet = Spreadsheet::ParseExcel::Worksheet->new(%$sheet); + $self->{Worksheet}[$self->{SheetCount}] = $wsheet; + $self->{SheetCount} += 1; + + } + + + foreach my $sheet (@{$self->{Worksheet}}) { + + my $member_sheet = $zip->memberNamed("xl/$sheet->{path}") or next; + + my ($row, $col); + + my $parsing_v_tag = 0; + my $s = 0; + my $s2 = 0; + my $sty = 0; + foreach ($member_sheet->contents =~ /(\<.*?\/?\>|.*?(?=\<))/g) { + if (/^\<c\s*.*?\s*r=\"([A-Z])([A-Z]?)(\d+)\"/) { + + ($row, $col) = __decode_cell_name($1, $2, $3); + + $s = m/t=\"s\"/ ? 1 : 0; + $s2 = m/t=\"str\"/ ? 1 : 0; + $sty = m/s="([0-9]+)"/ ? $1 : 0; + + } elsif (/^<v>/) { + $parsing_v_tag = 1; + } elsif (/^<\/v>/) { + $parsing_v_tag = 0; + } elsif (length($_) && $parsing_v_tag) { + my $v = $s ? $shared_info->{shared_strings}->[$_] : $_; + + if ($v eq "</c>") { + $v = ""; + } + my $type = "Text"; + my $thisstyle = ""; + + if (not($s) && not($s2)) { + $type = "Numeric"; + + if (defined $sty && defined $shared_info->{styles}->[$sty]) { + $thisstyle = $shared_info->{style_info}->{$shared_info->{styles}->[$sty]}; + if ($thisstyle =~ /\b(mmm|m|d|yy|h|hh|mm|ss)\b/) { + $type = "Date"; + } + } } - my $default = $1 || ''; - - foreach my $t1 (@styles){ - $member_styles -> contents =~ /numFmtId="$t1" formatCode="([^"]*)/; - my $formatCode = $1 || ''; - if ($formatCode eq $default || not($formatCode)){ - if ($t1 == 9 || $t1==10){ $formatCode="0.00000%";} - elsif ($t1 == 14){ $formatCode="m-d-yy";} - else { - $formatCode=""; - } - } - $style_info{$t1} = $formatCode; - $default = $1 || ''; - } + + $sheet->{MaxRow} = $row if $sheet->{MaxRow} < $row; + $sheet->{MaxCol} = $col if $sheet->{MaxCol} < $col; + $sheet->{MinRow} = $row if $sheet->{MinRow} > $row; + $sheet->{MinCol} = $col if $sheet->{MinCol} > $col; + + if ($v =~ /(.*)E\-(.*)/gsm && $type eq "Numeric") { + $v = $1 / (10**$2); # this handles scientific notation for very small numbers + } + + my $cell = Spreadsheet::ParseExcel::Cell->new( + Val => $v, + Format => $thisstyle, + Type => $type + ); + + $cell->{_Value} = $self->{FmtClass}->ValFmt($cell, $self); + if ($type eq "Date") { + if ($v < 1) { #then this is Excel time field + $cell->{Type} = "Text"; + } + $cell->{Val} = $cell->{_Value}; + } + $sheet->{Cells}[$row][$col] = $cell; + } } - my $member_rels = $self -> {zip} -> memberNamed ('xl/_rels/workbook.xml.rels') or die ("xl/_rels/workbook.xml.rels not found in this zip\n"); - - my %rels = (); + $sheet->{MinRow} = 0 if $sheet->{MinRow} > $sheet->{MaxRow}; + $sheet->{MinCol} = 0 if $sheet->{MinCol} > $sheet->{MaxCol}; - foreach ($member_rels -> contents =~ /\<Relationship (.*?)\/?\>/g) { - - /^Id="(.*?)".*?Target="(.*?)"/ or next; - - $rels {$1} = $2; - - } - - my $member_workbook = $self -> {zip} -> memberNamed ('xl/workbook.xml') or die ("xl/workbook.xml not found in this zip\n"); - my $oBook = Spreadsheet::ParseExcel::Workbook->new; - $oBook->{SheetCount} = 0; - $oBook->{FmtClass} = Spreadsheet::XLSX::Fmt2007->new; - $oBook->{Flg1904}=0; - if ($member_workbook->contents =~ /date1904="1"/){ - $oBook->{Flg1904}=1; - } - my @Worksheet = (); - - foreach ($member_workbook -> contents =~ /\<(.*?)\/?\>/g) { - - /^(\w+)\s+/; - - my ($tag, $other) = ($1, $'); - - my @pairs = split /\" /, $other; - - $tag eq 'sheet' or next; - - my $sheet = { - MaxRow => 0, - MaxCol => 0, - MinRow => 1000000, - MinCol => 1000000, - }; - - foreach ($other =~ /(\S+=".*?")/gsm) { - - my ($k, $v) = split /=?"/; #" - - if ($k eq 'name') { - $sheet -> {Name} = $v; - $sheet -> {Name} = $converter -> convert ($sheet -> {Name}) if $converter; - } - elsif ($k eq 'r:id') { - - $sheet -> {path} = $rels {$v}; - - }; - - } - my $wsheet = Spreadsheet::ParseExcel::Worksheet->new(%$sheet); - push @Worksheet, $wsheet; - $oBook->{Worksheet}[$oBook->{SheetCount}] = $wsheet; - $oBook->{SheetCount}+=1; - - } - - $self -> {Worksheet} = \@Worksheet; - - foreach my $sheet (@Worksheet) { - - my $member_sheet = $self -> {zip} -> memberNamed ("xl/$sheet->{path}") or next; - - my ($row, $col); - - my $flag = 0; - my $s = 0; - my $s2 = 0; - my $sty = 0; - foreach ($member_sheet -> contents =~ /(\<.*?\/?\>|.*?(?=\<))/g) { - if (/^\<c r=\"([A-Z])([A-Z]?)(\d+)\"/) { - - $col = ord ($1) - 65; - - if ($2) { - $col++; - $col *= 26; - $col += (ord ($2) - 65); - } - - $row = $3 - 1; - - $s = m/t=\"s\"/ ? 1 : 0; - $s2 = m/t=\"str\"/ ? 1 : 0; - $sty = m/s="([0-9]+)"/ ? $1 : 0; - - } - elsif (/^<v/) { - $flag = 1; - } - elsif (/^<\/v/) { - $flag = 0; - } - elsif (length ($_) && $flag) { - my $v = $s ? $shared_strings [$_] : $_; - if ($v eq "</c>"){$v="";} - my $type = "Text"; - my $thisstyle = ""; - if (not($s) && not($s2)){ - $type="Numeric"; - $thisstyle = $style_info{$styles[$sty]}; - if ($thisstyle =~ /(?<!Re)d|m|y/){ - $type="Date"; - } - } - $sheet -> {MaxRow} = $row if $sheet -> {MaxRow} < $row; - $sheet -> {MaxCol} = $col if $sheet -> {MaxCol} < $col; - $sheet -> {MinRow} = $row if $sheet -> {MinRow} > $row; - $sheet -> {MinCol} = $col if $sheet -> {MinCol} > $col; - if ($v =~ /(.*)E\-(.*)/gsm && $type eq "Numeric"){ - $v=$1/(10**$2); # this handles scientific notation for very small numbers - } - my $cell =Spreadsheet::ParseExcel::Cell->new( - - Val => $v, - Format => $thisstyle, - Type => $type - - ); - - $cell->{_Value} = $oBook->{FmtClass}->ValFmt($cell, $oBook); - if ($type eq "Date" && $v<1){ #then this is Excel time field - $cell->{Type}="Text"; - $cell->{Val}=$cell->{_Value}; - } - $sheet -> {Cells} [$row] [$col] = $cell; - } - - } - - $sheet -> {MinRow} = 0 if $sheet -> {MinRow} > $sheet -> {MaxRow}; - $sheet -> {MinCol} = 0 if $sheet -> {MinCol} > $sheet -> {MaxCol}; - - } -foreach my $stys (keys %style_info){ + } + + return $self; +} + +# Convert cell name in the format AA1 to a row and column number. + +sub __decode_cell_name { + my ($letter1, $letter2, $digits) = @_; + + my $col = ord($letter1) - 65; + + if ($letter2) { + $col++; + $col *= 26; + $col += (ord($letter2) - 65); + } + + my $row = $digits - 1; + + return ($row, $col); +} + + +sub __load_shared_strings { + my ($zip, $converter) = @_; + + my $member_shared_strings = $zip->memberNamed('xl/sharedStrings.xml'); + + my @shared_strings = (); + + if ($member_shared_strings) { + + my $mstr = $member_shared_strings->contents; + $mstr =~ s/<t\/>/<t><\/t>/gsm; # this handles an empty t tag in the xml <t/> + foreach my $si ($mstr =~ /<si.*?>(.*?)<\/si/gsm) { + my $str; + foreach my $t ($si =~ /<t.*?>(.*?)<\/t/gsm) { + $t = $converter->convert($t) if defined $converter; + $str .= $t; + } + push @shared_strings, $str; + } + } + + return \@shared_strings; +} + + +sub __load_styles { + my ($zip) = @_; + + my $member_styles = $zip->memberNamed('xl/styles.xml'); + + my @styles = (); + my %style_info = (); + + if ($member_styles) { + my $formatter = Spreadsheet::XLSX::Fmt2007->new(); + + foreach my $t ($member_styles->contents =~ /xf\ numFmtId="([^"]*)"(?!.*\/cellStyleXfs)/gsm) { #" + push @styles, $t; + } + + my $default = $1 || ''; + + foreach my $t1 (@styles) { + $member_styles->contents =~ /numFmtId="$t1" formatCode="([^"]*)/; + my $formatCode = $1 || ''; + if ($formatCode eq $default || not($formatCode)) { + if ($t1 == 9 || $t1 == 10) { + $formatCode = '0.00000%'; + } elsif ($t1 == 14) { + $formatCode = 'yyyy-mm-dd'; + } else { + $formatCode = ''; + } +# $formatCode = $formatter->FmtStringDef($t1); + } + $style_info{$t1} = $formatCode; + $default = $1 || ''; + } + + } + return (\@styles, \%style_info); +} + + +sub __load_rels { + my ($zip) = @_; + + my $member_rels = $zip->memberNamed('xl/_rels/workbook.xml.rels') or die("xl/_rels/workbook.xml.rels not found in this zip\n"); + + my %rels = (); + + foreach ($member_rels->contents =~ /\<Relationship (.*?)\/?\>/g) { + + my ($id, $target); + ($id) = /Id="(.*?)"/; + ($target) = /Target="(.*?)"/; + + if (defined $id and defined $target) { + $rels{$id} = $target; + } + + } + + return \%rels; } - bless ($self, $class); - return $oBook; +sub __load_zip { + my ($filename) = @_; + my $zip = Archive::Zip->new(); + + if (ref $filename) { + $zip->readFromFileHandle($filename) == Archive::Zip::AZ_OK or die("Cannot open data as Zip archive"); + } else { + $zip->read($filename) == Archive::Zip::AZ_OK or die("Cannot open $filename as Zip archive"); + } + + return $zip; } + 1; __END__ diff --git a/lib/Spreadsheet/XLSX/Fmt2007.pm b/lib/Spreadsheet/XLSX/Fmt2007.pm index de93780..50aed60 100755 --- a/lib/Spreadsheet/XLSX/Fmt2007.pm +++ b/lib/Spreadsheet/XLSX/Fmt2007.pm @@ -8,7 +8,7 @@ use strict; use warnings; use Spreadsheet::XLSX::Utility2007 qw(ExcelFmt); -our $VERSION = '0.13'; # +our $VERSION = '0.13'; # my %hFmtDefault = ( 0x00 => '@', @@ -25,7 +25,7 @@ my %hFmtDefault = ( 0x0B => '0.00E+00', 0x0C => '# ?/?', 0x0D => '# ??/??', - 0x0E => 'm-d-yy', + 0x0E => 'yyyy-mm-dd', 0x0F => 'd-mmm-yy', 0x10 => 'd-mmm', 0x11 => 'mmm-yy', @@ -34,7 +34,8 @@ my %hFmtDefault = ( 0x14 => 'h:mm', 0x15 => 'h:mm:ss', 0x16 => 'm-d-yy h:mm', -#0x17-0x24 -- Differs in Natinal + + #0x17-0x24 -- Differs in Natinal 0x25 => '(#,##0_);(#,##0)', 0x26 => '(#,##0_);[RED](#,##0)', 0x27 => '(#,##0.00);(#,##0.00)', @@ -49,107 +50,105 @@ my %hFmtDefault = ( 0x30 => '##0.0E+0', 0x31 => '@', ); + #------------------------------------------------------------------------------ # new (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub new { - my($sPkg, %hKey) = @_; - my $oThis={ - }; + my ($sPkg, %hKey) = @_; + my $oThis = {}; bless $oThis; return $oThis; } + #------------------------------------------------------------------------------ # TextFmt (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub TextFmt { - my($oThis, $sTxt, $sCode) =@_; - return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); + my ($oThis, $sTxt, $sCode) = @_; + return $sTxt if ((!defined($sCode)) || ($sCode eq '_native_')); return pack('U*', unpack('n*', $sTxt)); } + #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub FmtStringDef { - my($oThis, $iFmtIdx, $oBook, $rhFmt) =@_; + my ($oThis, $iFmtIdx, $oBook, $rhFmt) = @_; my $sFmtStr = $oBook->{FormatStr}->{$iFmtIdx}; - if(!(defined($sFmtStr)) && defined($rhFmt)) { + if (!(defined($sFmtStr)) && defined($rhFmt)) { $sFmtStr = $rhFmt->{$iFmtIdx}; } - $sFmtStr = $hFmtDefault{$iFmtIdx} unless($sFmtStr); + $sFmtStr = $hFmtDefault{$iFmtIdx} unless ($sFmtStr); return $sFmtStr; } + #------------------------------------------------------------------------------ # FmtString (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub FmtString { - my($oThis, $oCell, $oBook) =@_; + my ($oThis, $oCell, $oBook) = @_; + + my $sFmtStr; # = $oThis->FmtStringDef( - my $sFmtStr;# = $oThis->FmtStringDef( -# $oBook->{Format}[$oCell->{FormatNo}]->{FmtIdx}, $oBook); + # $oBook->{Format}[$oCell->{FormatNo}]->{FmtIdx}, $oBook); - unless(defined($sFmtStr)) { + unless (defined($sFmtStr)) { if ($oCell->{Type} eq 'Numeric') { - if($oCell->{Format}){ - $sFmtStr=$oCell->{Format}; - } elsif(int($oCell->{Val}) != $oCell->{Val}) { + if ($oCell->{Format}) { + $sFmtStr = $oCell->{Format}; + } elsif (int($oCell->{Val}) != $oCell->{Val}) { $sFmtStr = '0.00'; - } - else { + } else { $sFmtStr = '0'; } - } - elsif($oCell->{Type} eq 'Date') { - if($oCell->{Format}){ - $sFmtStr=$oCell->{Format}; - } elsif(int($oCell->{Val}) <= 0) { + } elsif ($oCell->{Type} eq 'Date') { + if ($oCell->{Format}) { + $sFmtStr = $oCell->{Format}; + } elsif (int($oCell->{Val}) <= 0) { $sFmtStr = 'h:mm:ss'; - } - else { + } else { $sFmtStr = 'm-d-yy'; } - } - else { + } else { $sFmtStr = '@'; } } return $sFmtStr; } + #------------------------------------------------------------------------------ # ValFmt (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub ValFmt { - my($oThis, $oCell, $oBook) =@_; + my ($oThis, $oCell, $oBook) = @_; - my($Dt, $iFmtIdx, $iNumeric, $Flg1904); + my ($Dt, $iFmtIdx, $iNumeric, $Flg1904); if ($oCell->{Type} eq 'Text') { - $Dt = ((defined $oCell->{Val}) && ($oCell->{Val} ne ''))? - $oThis->TextFmt($oCell->{Val}, $oCell->{Code}):''; - } - else { + $Dt = ((defined $oCell->{Val}) && ($oCell->{Val} ne '')) ? $oThis->TextFmt($oCell->{Val}, $oCell->{Code}) : ''; + } else { $Dt = $oCell->{Val}; } - $Flg1904 = $oBook->{Flg1904}; + $Flg1904 = $oBook->{Flg1904}; my $sFmtStr = $oThis->FmtString($oCell, $oBook); return ExcelFmt($sFmtStr, $Dt, $Flg1904, $oCell->{Type}); } + #------------------------------------------------------------------------------ # ChkType (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub ChkType { - my($oPkg, $iNumeric, $iFmtIdx) =@_; + my ($oPkg, $iNumeric, $iFmtIdx) = @_; if ($iNumeric) { - if((($iFmtIdx >= 0x0E) && ($iFmtIdx <= 0x16)) || - (($iFmtIdx >= 0x2D) && ($iFmtIdx <= 0x2F))) { + if ( (($iFmtIdx >= 0x0E) && ($iFmtIdx <= 0x16)) + || (($iFmtIdx >= 0x2D) && ($iFmtIdx <= 0x2F))) { return "Date"; - } - else { + } else { return "Numeric"; } - } - else { + } else { return "Text"; } } diff --git a/lib/Spreadsheet/XLSX/Utility2007.pm b/lib/Spreadsheet/XLSX/Utility2007.pm index d6cd106..907b96c 100755 --- a/lib/Spreadsheet/XLSX/Utility2007.pm +++ b/lib/Spreadsheet/XLSX/Utility2007.pm @@ -11,7 +11,7 @@ use warnings; require Exporter; use vars qw(@ISA @EXPORT_OK); -@ISA = qw(Exporter); +@ISA = qw(Exporter); @EXPORT_OK = qw(ExcelFmt LocaltimeExcel ExcelLocaltime col2int int2col sheetRef xls2csv); our $VERSION = '0.13'; @@ -21,469 +21,410 @@ my $sNUMEXP = '(^[+-]?\d+(\.\d+)?$)|(^[+-]?\d+\.?(\d*)[eE][+-](\d+))$'; # ExcelFmt (for Spreadsheet::XLSX::Utility2007) #------------------------------------------------------------------------------ sub ExcelFmt { - my($sFmt, $iData, $i1904, $sType) =@_; + my ($sFmt, $iData, $i1904, $sType) = @_; my $sCond; - my $sWkF =''; - my $sRes=''; - $sFmt=unescape_HTML($sFmt); -#1. Get Condition - if($sFmt=~/^\[([<>=][^\]]+)\](.*)$/) { + my $sWkF = ''; + my $sRes = ''; + $sFmt = unescape_HTML($sFmt); + + #1. Get Condition + if ($sFmt =~ /^\[([<>=][^\]]+)\](.*)$/) { $sCond = $1; - $sFmt = $2; + $sFmt = $2; } $sFmt =~ s/_/ /g; my @sFmtWk; my $sFmtObj; - my $iFmtPos=0; - my $iDblQ=0; - my $iQ = 0; + my $iFmtPos = 0; + my $iDblQ = 0; + my $iQ = 0; foreach my $sWk (split //, $sFmt) { - if($iDblQ or $iQ) { - $sFmtWk[$iFmtPos] .=$sWk; - $iDblQ = 0 if($sWk eq '"'); + if ($iDblQ or $iQ) { + $sFmtWk[$iFmtPos] .= $sWk; + $iDblQ = 0 if ($sWk eq '"'); $iQ = 0; next; } - if($sWk eq ';') { + if ($sWk eq ';') { $iFmtPos++; next; - } - elsif($sWk eq '"') { + } elsif ($sWk eq '"') { $iDblQ = 1; - } - elsif($sWk eq '!') { + } elsif ($sWk eq '!') { $iQ = 1; - } - elsif($sWk eq '\\') { + } elsif ($sWk eq '\\') { $iQ = 1; -# next; - } - elsif($sWk eq '(') { #Skip? + + # next; + } elsif ($sWk eq '(') { #Skip? next; - } - elsif($sWk eq ')') { #Skip? + } elsif ($sWk eq ')') { #Skip? next; } - $sFmtWk[$iFmtPos] .=$sWk; + $sFmtWk[$iFmtPos] .= $sWk; } -#Get FmtString - if(scalar(@sFmtWk)>1) { - if($sCond) { - $sFmtObj = $sFmtWk[((eval(qq/"$iData" $sCond/))? 0: 1)]; - } - else { - my $iWk = ($iData =~/$sNUMEXP/)? $iData: 0; + + #Get FmtString + if (scalar(@sFmtWk) > 1) { + if ($sCond) { + $sFmtObj = $sFmtWk[((eval(qq/"$iData" $sCond/)) ? 0 : 1)]; + } else { + my $iWk = ($iData =~ /$sNUMEXP/) ? $iData : 0; + # $iData = abs($iData) if($iWk !=0); - if(scalar(@sFmtWk)==2) { - $sFmtObj = $sFmtWk[(($iWk>=0)? 0: 1)]; - } - elsif(scalar(@sFmtWk)==3) { - $sFmtObj = $sFmtWk[(($iWk>0)? 0: (($iWk<0)? 1: 2))]; - } - else { - if($iData =~/$sNUMEXP/) { - $sFmtObj = $sFmtWk[(($iWk>0)? 0: (($iWk<0)? 1: 2))]; - } - else { - $sFmtObj = $sFmtWk[ 3]; + if (scalar(@sFmtWk) == 2) { + $sFmtObj = $sFmtWk[(($iWk >= 0) ? 0 : 1)]; + } elsif (scalar(@sFmtWk) == 3) { + $sFmtObj = $sFmtWk[(($iWk > 0) ? 0 : (($iWk < 0) ? 1 : 2))]; + } else { + if ($iData =~ /$sNUMEXP/) { + $sFmtObj = $sFmtWk[(($iWk > 0) ? 0 : (($iWk < 0) ? 1 : 2))]; + } else { + $sFmtObj = $sFmtWk[3]; } } } - } - else { + } else { $sFmtObj = $sFmtWk[0]; } my $sColor; - if($sFmtObj =~ /^(\[[^hm\[\]]*\])/) { + if ($sFmtObj =~ /^(\[[^hm\[\]]*\])/) { $sColor = $1; $sFmtObj = substr($sFmtObj, length($sColor)); chop($sColor); $sColor = substr($sColor, 1); } -#print "FMT:$sFmtObj Co:$sColor\n"; -#3.Build Data - my $iFmtMode=0; #1:Number, 2:Date - my $i=0; - my $ir=0; + #print "FMT:$sFmtObj Co:$sColor\n"; + + #3.Build Data + my $iFmtMode = 0; #1:Number, 2:Date + my $i = 0; + my $ir = 0; my $sFmtWk; - my @aRep = (); - my $sFmtRes=''; + my @aRep = (); + my $sFmtRes = ''; - my $iFflg = -1; - my $iRpos = -1; - my $iCmmCnt = 0; - my $iBunFlg = 0; + my $iFflg = -1; + my $iRpos = -1; + my $iCmmCnt = 0; + my $iBunFlg = 0; my $iFugouFlg = 0; - my $iPer = 0; - my $iAm=0; + my $iPer = 0; + my $iAm = 0; my $iSt; - while($i<length($sFmtObj)) { + while ($i < length($sFmtObj)) { $iSt = $i; my $sWk = substr($sFmtObj, $i, 1); - if($sWk !~ /[#0\+\-\.\?eE\,\%]/) { - if($iFflg != -1) { - push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg), - $iRpos, $i-$iFflg]; - $iFflg= -1; + if ($sWk !~ /[#0\+\-\.\?eE\,\%]/) { + if ($iFflg != -1) { + push @aRep, [substr($sFmtObj, $iFflg, $i - $iFflg), $iRpos, $i - $iFflg]; + $iFflg = -1; } } - if($sWk eq '"') { - $iDblQ = $iDblQ? 0: 1; + if ($sWk eq '"') { + $iDblQ = $iDblQ ? 0 : 1; $i++; next; - } - elsif($sWk eq '!') { + } elsif ($sWk eq '!') { $iQ = 1; $i++; next; - } - elsif($sWk eq '\\') { - if($iQ == 1) { - } - else { + } elsif ($sWk eq '\\') { + if ($iQ == 1) { + } else { $iQ = 1; $i++; next; } } -#print "WK:", ord($sWk), " $iFmtMode \n"; -#print "DEF1: $iDblQ DEF2: $iQ\n"; - if((defined($iDblQ) and ($iDblQ)) or (defined($iQ) and ($iQ))) { + + #print "WK:", ord($sWk), " $iFmtMode \n"; + #print "DEF1: $iDblQ DEF2: $iQ\n"; + if ((defined($iDblQ) and ($iDblQ)) or (defined($iQ) and ($iQ))) { $iQ = 0; - if(($iFmtMode != 2) and - ((substr($sFmtObj, $i, 2) eq "\x81\xA2") || - (substr($sFmtObj, $i, 2) eq "\x81\xA3") || - (substr($sFmtObj, $i, 2) eq "\xA2\xA4") || - (substr($sFmtObj, $i, 2) eq "\xA2\xA5")) - ){ -#print "PUSH:", unpack("H*", substr($sFmtObj, $i, 2)), "\n"; - push @aRep, [substr($sFmtObj, $i, 2), - length($sFmtRes), 2]; + if ( + ($iFmtMode != 2) + and ( (substr($sFmtObj, $i, 2) eq "\x81\xA2") + || (substr($sFmtObj, $i, 2) eq "\x81\xA3") + || (substr($sFmtObj, $i, 2) eq "\xA2\xA4") + || (substr($sFmtObj, $i, 2) eq "\xA2\xA5")) + ) { + #print "PUSH:", unpack("H*", substr($sFmtObj, $i, 2)), "\n"; + push @aRep, [substr($sFmtObj, $i, 2), length($sFmtRes), 2]; $iFugouFlg = 1; - $i+=2; - } - else{ + $i += 2; + } else { $i++; } - } - elsif(($sWk =~ /[#0\+\.\?eE\,\%]/) || - (($iFmtMode != 2) and - (($sWk eq '-') || ($sWk eq '(') || ($sWk eq ')'))) - ) { - $iFmtMode = 1 unless($iFmtMode); - if(substr($sFmtObj, $i, 1) =~ /[#0]/) { - if(substr($sFmtObj, $i) =~ /^([#0]+)([\.]?)([0#]*)([eE])([\+\-])([0#]+)/){ + } elsif ( + ($sWk =~ /[#0\+\.\?eE\,\%]/) + || ( ($iFmtMode != 2) + and (($sWk eq '-') || ($sWk eq '(') || ($sWk eq ')'))) + ) { + $iFmtMode = 1 unless ($iFmtMode); + if (substr($sFmtObj, $i, 1) =~ /[#0]/) { + if (substr($sFmtObj, $i) =~ /^([#0]+)([\.]?)([0#]*)([eE])([\+\-])([0#]+)/) { push @aRep, [substr($sFmtObj, $i, length($&)), $i, length($&)]; - $i +=length($&); - } - else{ - if($iFflg==-1) { + $i += length($&); + } else { + if ($iFflg == -1) { $iFflg = $i; $iRpos = length($sFmtRes); } } - } - elsif(substr($sFmtObj, $i, 1) eq '?') { - if($iFflg != -1) { - push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg+1), - $iRpos, $i-$iFflg+1]; + } elsif (substr($sFmtObj, $i, 1) eq '?') { + if ($iFflg != -1) { + push @aRep, [substr($sFmtObj, $iFflg, $i - $iFflg + 1), $iRpos, $i - $iFflg + 1]; } $iFflg = $i; - while($i<length($sFmtObj)) { - if (substr($sFmtObj, $i, 1) eq '/'){ + while ($i < length($sFmtObj)) { + if (substr($sFmtObj, $i, 1) eq '/') { $iBunFlg = 1; - } - elsif (substr($sFmtObj, $i, 1) eq '?'){ + } elsif (substr($sFmtObj, $i, 1) eq '?') { ; - } - else { - if(($iBunFlg) && (substr($sFmtObj, $i, 1) =~ /[0-9]/)) { + } else { + if (($iBunFlg) && (substr($sFmtObj, $i, 1) =~ /[0-9]/)) { ; - } - else { + } else { last; } } $i++; } $i--; - push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg+1), - length($sFmtRes), $i-$iFflg+1]; + push @aRep, [substr($sFmtObj, $iFflg, $i - $iFflg + 1), length($sFmtRes), $i - $iFflg + 1]; $iFflg = -1; - } - elsif(substr($sFmtObj, $i, 3) =~ /^[eE][\+\-][0#]$/) { - if(substr($sFmtObj, $i) =~ /([eE])([\+\-])([0#]+)/){ + } elsif (substr($sFmtObj, $i, 3) =~ /^[eE][\+\-][0#]$/) { + if (substr($sFmtObj, $i) =~ /([eE])([\+\-])([0#]+)/) { push @aRep, [substr($sFmtObj, $i, length($&)), $i, length($&)]; - $i +=length($&); + $i += length($&); } $iFflg = -1; - } - else { - if($iFflg != -1) { - push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg), - $iRpos, $i-$iFflg]; - $iFflg= -1; + } else { + if ($iFflg != -1) { + push @aRep, [substr($sFmtObj, $iFflg, $i - $iFflg), $iRpos, $i - $iFflg]; + $iFflg = -1; } - if(substr($sFmtObj, $i, 1) =~ /[\+\-]/) { - push @aRep, [substr($sFmtObj, $i, 1), - length($sFmtRes), 1]; + if (substr($sFmtObj, $i, 1) =~ /[\+\-]/) { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; $iFugouFlg = 1; - } - elsif(substr($sFmtObj, $i, 1) eq '.') { - push @aRep, [substr($sFmtObj, $i, 1), - length($sFmtRes), 1]; - } - elsif(substr($sFmtObj, $i, 1) eq ',') { + } elsif (substr($sFmtObj, $i, 1) eq '.') { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; + } elsif (substr($sFmtObj, $i, 1) eq ',') { $iCmmCnt++; - push @aRep, [substr($sFmtObj, $i, 1), - length($sFmtRes), 1]; - } - elsif(substr($sFmtObj, $i, 1) eq '%') { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; + } elsif (substr($sFmtObj, $i, 1) eq '%') { $iPer = 1; - } - elsif((substr($sFmtObj, $i, 1) eq '(') || - (substr($sFmtObj, $i, 1) eq ')')) { - push @aRep, [substr($sFmtObj, $i, 1), - length($sFmtRes), 1]; - $iFugouFlg = 1; + } elsif ((substr($sFmtObj, $i, 1) eq '(') + || (substr($sFmtObj, $i, 1) eq ')')) { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; + $iFugouFlg = 1; } } $i++; - } - elsif($sWk =~ /[ymdhsapg]/) { - $iFmtMode = 2 unless($iFmtMode); - if(substr($sFmtObj, $i, 5) =~ /am\/pm/i) { + } elsif ($sWk =~ /[ymdhsapg]/) { + $iFmtMode = 2 unless ($iFmtMode); + if (substr($sFmtObj, $i, 5) =~ /am\/pm/i) { push @aRep, ['am/pm', length($sFmtRes), 5]; - $iAm=1; - $i+=5; - } - elsif(substr($sFmtObj, $i, 3) =~ /a\/p/i) { + $iAm = 1; + $i += 5; + } elsif (substr($sFmtObj, $i, 3) =~ /a\/p/i) { push @aRep, ['a/p', length($sFmtRes), 3]; - $iAm=1; - $i+=3; - } - elsif(substr($sFmtObj, $i, 5) eq 'mmmmm') { + $iAm = 1; + $i += 3; + } elsif (substr($sFmtObj, $i, 5) eq 'mmmmm') { push @aRep, ['mmmmm', length($sFmtRes), 5]; - $i+=5; - } - elsif((substr($sFmtObj, $i, 4) eq 'mmmm') || - (substr($sFmtObj, $i, 4) eq 'dddd') || - (substr($sFmtObj, $i, 4) eq 'yyyy') || - (substr($sFmtObj, $i, 4) eq 'ggge') - ) { + $i += 5; + } elsif ((substr($sFmtObj, $i, 4) eq 'mmmm') + || (substr($sFmtObj, $i, 4) eq 'dddd') + || (substr($sFmtObj, $i, 4) eq 'yyyy') + || (substr($sFmtObj, $i, 4) eq 'ggge')) { push @aRep, [substr($sFmtObj, $i, 4), length($sFmtRes), 4]; - $i+=4; - } - elsif((substr($sFmtObj, $i, 3) eq 'mmm') || - (substr($sFmtObj, $i, 3) eq 'yyy')) { + $i += 4; + } elsif ((substr($sFmtObj, $i, 3) eq 'mmm') + || (substr($sFmtObj, $i, 3) eq 'yyy')) { push @aRep, [substr($sFmtObj, $i, 3), length($sFmtRes), 3]; - $i+=3; - } - elsif((substr($sFmtObj, $i, 2) eq 'yy') || - (substr($sFmtObj, $i, 2) eq 'mm') || - (substr($sFmtObj, $i, 2) eq 'dd') || - (substr($sFmtObj, $i, 2) eq 'hh') || - (substr($sFmtObj, $i, 2) eq 'ss') || - (substr($sFmtObj, $i, 2) eq 'ge')) { - if((substr($sFmtObj, $i, 2) eq 'mm') && - ($#aRep>=0) && - (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { - push @aRep, ['mm', length($sFmtRes), 2, 'min']; - } - else { - push @aRep, [substr($sFmtObj, $i, 2), length($sFmtRes), 2]; + $i += 3; + } elsif ((substr($sFmtObj, $i, 2) eq 'yy') + || (substr($sFmtObj, $i, 2) eq 'mm') + || (substr($sFmtObj, $i, 2) eq 'dd') + || (substr($sFmtObj, $i, 2) eq 'hh') + || (substr($sFmtObj, $i, 2) eq 'ss') + || (substr($sFmtObj, $i, 2) eq 'ge')) { + if ( (substr($sFmtObj, $i, 2) eq 'mm') + && ($#aRep >= 0) + && (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { + push @aRep, ['mm', length($sFmtRes), 2, 'min']; + } else { + push @aRep, [substr($sFmtObj, $i, 2), length($sFmtRes), 2]; } - if((substr($sFmtObj, $i, 2) eq 'ss') && ($#aRep>0)) { - if(($aRep[$#aRep-1]->[0] eq 'm') || - ($aRep[$#aRep-1]->[0] eq 'mm')) { - push(@{$aRep[$#aRep-1]}, 'min'); + if ((substr($sFmtObj, $i, 2) eq 'ss') && ($#aRep > 0)) { + if ( ($aRep[$#aRep - 1]->[0] eq 'm') + || ($aRep[$#aRep - 1]->[0] eq 'mm')) { + push(@{$aRep[$#aRep - 1]}, 'min'); } } - $i+=2; - } - elsif((substr($sFmtObj, $i, 1) eq 'm') || - (substr($sFmtObj, $i, 1) eq 'd') || - (substr($sFmtObj, $i, 1) eq 'h') || - (substr($sFmtObj, $i, 1) eq 's')){ - if((substr($sFmtObj, $i, 1) eq 'm') && - ($#aRep>=0) && - (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { - push @aRep, ['m', length($sFmtRes), 1, 'min']; - } - else { - push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; + $i += 2; + } elsif ((substr($sFmtObj, $i, 1) eq 'm') + || (substr($sFmtObj, $i, 1) eq 'd') + || (substr($sFmtObj, $i, 1) eq 'h') + || (substr($sFmtObj, $i, 1) eq 's')) { + if ( (substr($sFmtObj, $i, 1) eq 'm') + && ($#aRep >= 0) + && (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { + push @aRep, ['m', length($sFmtRes), 1, 'min']; + } else { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; } - if((substr($sFmtObj, $i, 1) eq 's') && ($#aRep>0)) { - if(($aRep[$#aRep-1]->[0] eq 'm') || - ($aRep[$#aRep-1]->[0] eq 'mm')) { - push(@{$aRep[$#aRep-1]}, 'min'); + if ((substr($sFmtObj, $i, 1) eq 's') && ($#aRep > 0)) { + if ( ($aRep[$#aRep - 1]->[0] eq 'm') + || ($aRep[$#aRep - 1]->[0] eq 'mm')) { + push(@{$aRep[$#aRep - 1]}, 'min'); } } - $i+=1; + $i += 1; } - } - elsif((substr($sFmtObj, $i, 3) eq '[h]')) { + } elsif ((substr($sFmtObj, $i, 3) eq '[h]')) { push @aRep, ['[h]', length($sFmtRes), 3]; - $i+=3; - } - elsif((substr($sFmtObj, $i, 4) eq '[mm]')) { + $i += 3; + } elsif ((substr($sFmtObj, $i, 4) eq '[mm]')) { push @aRep, ['[mm]', length($sFmtRes), 4]; - $i+=4; - } - elsif($sWk eq '@') { + $i += 4; + } elsif ($sWk eq '@') { push @aRep, ['@', length($sFmtRes), 1]; $i++; - } - elsif($sWk eq '*') { - push @aRep, [substr($sFmtObj, $i, 1), - length($sFmtRes), 1]; - } - else{ + } elsif ($sWk eq '*') { + push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; + } else { $i++; } - $i++ if($i == $iSt); #No Format match - $sFmtRes .= substr($sFmtObj, $iSt, $i-$iSt); + $i++ if ($i == $iSt); #No Format match + $sFmtRes .= substr($sFmtObj, $iSt, $i - $iSt); } -#print "FMT: $iRpos ",$sFmtRes, "\n"; - if($iFflg != -1) { - push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg+1), - $iRpos,, $i-$iFflg+1]; - $iFflg= 0; + + #print "FMT: $iRpos ",$sFmtRes, "\n"; + if ($iFflg != -1) { + push @aRep, [substr($sFmtObj, $iFflg, $i - $iFflg + 1), $iRpos,, $i - $iFflg + 1]; + $iFflg = 0; } -#For Date format - $iFmtMode = 0 if(defined $sType && $sType eq 'Text'); #Not Convert Non Numeric - if(($iFmtMode==2)&& ($iData =~/$sNUMEXP/)) { + #For Date format + $iFmtMode = 0 if (defined $sType && $sType eq 'Text'); #Not Convert Non Numeric + if (($iFmtMode == 2) && ($iData =~ /$sNUMEXP/)) { my @aTime = ExcelLocaltime($iData, $i1904); $aTime[4]++; $aTime[5] += 1900; - my @aMonL = - qw (dum January February March April May June July - August September October November December ); - my @aMonNm = - qw (dum Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - my @aWeekNm = - qw (Mon Tue Wed Thu Fri Sat Sun); - my @aWeekL = - qw (Monday Tuesday Wednesday Thursday Friday Saturday Sunday); + my @aMonL = qw (dum January February March April May June July + August September October November December ); + my @aMonNm = qw (dum Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + my @aWeekNm = qw (Mon Tue Wed Thu Fri Sat Sun); + my @aWeekL = qw (Monday Tuesday Wednesday Thursday Friday Saturday Sunday); my $sRep; - for(my $iIt=$#aRep; $iIt>=0;$iIt--) { + for (my $iIt = $#aRep ; $iIt >= 0 ; $iIt--) { my $rItem = $aRep[$iIt]; - if((scalar @$rItem) >=4) { - #Min - if($rItem->[0] eq 'mm') { + if ((scalar @$rItem) >= 4) { + + #Min + if ($rItem->[0] eq 'mm') { $sRep = sprintf("%02d", $aTime[1]); - } - else { + } else { $sRep = sprintf("%d", $aTime[1]); } } - #Year - elsif($rItem->[0] eq 'yyyy') { + + #Year + elsif ($rItem->[0] eq 'yyyy') { $sRep = sprintf('%04d', $aTime[5]); - } - elsif($rItem->[0] eq 'yy') { + } elsif ($rItem->[0] eq 'yy') { $sRep = sprintf('%02d', $aTime[5] % 100); } - #Mon - elsif($rItem->[0] eq 'mmmmm') { + + #Mon + elsif ($rItem->[0] eq 'mmmmm') { $sRep = substr($aMonNm[$aTime[4]], 0, 1); - } - elsif($rItem->[0] eq 'mmmm') { + } elsif ($rItem->[0] eq 'mmmm') { $sRep = $aMonL[$aTime[4]]; - } - elsif($rItem->[0] eq 'mmm') { + } elsif ($rItem->[0] eq 'mmm') { $sRep = $aMonNm[$aTime[4]]; - } - elsif($rItem->[0] eq 'mm') { + } elsif ($rItem->[0] eq 'mm') { $sRep = sprintf('%02d', $aTime[4]); - } - elsif($rItem->[0] eq 'm') { + } elsif ($rItem->[0] eq 'm') { $sRep = sprintf('%d', $aTime[4]); } - #Day - elsif($rItem->[0] eq 'dddd') { + + #Day + elsif ($rItem->[0] eq 'dddd') { $sRep = $aWeekL[$aTime[7]]; - } - elsif($rItem->[0] eq 'ddd') { + } elsif ($rItem->[0] eq 'ddd') { $sRep = $aWeekNm[$aTime[7]]; - } - elsif($rItem->[0] eq 'dd') { + } elsif ($rItem->[0] eq 'dd') { $sRep = sprintf('%02d', $aTime[3]); - } - elsif($rItem->[0] eq 'd') { + } elsif ($rItem->[0] eq 'd') { $sRep = sprintf('%d', $aTime[3]); } - #Hour - elsif($rItem->[0] eq 'hh') { - if($iAm) { - $sRep = sprintf('%02d', $aTime[2]%12); - } - else { + + #Hour + elsif ($rItem->[0] eq 'hh') { + if ($iAm) { + $sRep = sprintf('%02d', $aTime[2] % 12); + } else { $sRep = sprintf('%02d', $aTime[2]); } - } - elsif($rItem->[0] eq 'h') { - if($iAm) { - $sRep = sprintf('%d', $aTime[2]%12); - } - else { + } elsif ($rItem->[0] eq 'h') { + if ($iAm) { + $sRep = sprintf('%d', $aTime[2] % 12); + } else { $sRep = sprintf('%d', $aTime[2]); } } - #SS - elsif($rItem->[0] eq 'ss') { + + #SS + elsif ($rItem->[0] eq 'ss') { $sRep = sprintf('%02d', $aTime[0]); - } - elsif($rItem->[0] eq 'S') { + } elsif ($rItem->[0] eq 'S') { $sRep = sprintf('%d', $aTime[0]); } - #am/pm - elsif($rItem->[0] eq 'am/pm') { - $sRep = ($aTime[4]>12)? 'pm':'am'; - } - elsif($rItem->[0] eq 'a/p') { - $sRep = ($aTime[4]>12)? 'p':'a'; - } - elsif($rItem->[0] eq '.') { + + #am/pm + elsif ($rItem->[0] eq 'am/pm') { + $sRep = ($aTime[4] > 12) ? 'pm' : 'am'; + } elsif ($rItem->[0] eq 'a/p') { + $sRep = ($aTime[4] > 12) ? 'p' : 'a'; + } elsif ($rItem->[0] eq '.') { $sRep = '.'; - } - elsif($rItem->[0] =~ /^0+$/) { + } elsif ($rItem->[0] =~ /^0+$/) { my $i0Len = length($&); -#print "SEC:", $aTime[7], "\n"; - $sRep = substr(sprintf("%.${i0Len}f", $aTime[7]/1000.0), 2, $i0Len); - } - elsif($rItem->[0] eq '[h]') { + + #print "SEC:", $aTime[7], "\n"; + $sRep = substr(sprintf("%.${i0Len}f", $aTime[7] / 1000.0), 2, $i0Len); + } elsif ($rItem->[0] eq '[h]') { $sRep = sprintf('%d', int($iData) * 24 + $aTime[2]); + } elsif ($rItem->[0] eq '[mm]') { + $sRep = sprintf('%d', (int($iData) * 24 + $aTime[2]) * 60 + $aTime[1]); } - elsif($rItem->[0] eq '[mm]') { - $sRep = sprintf('%d', (int($iData) * 24 + $aTime[2])*60 + $aTime[1]); - } -#NENGO(Japanese) - elsif($rItem->[0] eq 'ge') { + + #NENGO(Japanese) + elsif ($rItem->[0] eq 'ge') { $sRep = Spreadsheet::XLSX::FmtJapan::CnvNengo(1, @aTime); - } - elsif($rItem->[0] eq 'ggge') { + } elsif ($rItem->[0] eq 'ggge') { $sRep = Spreadsheet::XLSX::FmtJapan::CnvNengo(2, @aTime); - } - elsif($rItem->[0] eq '@') { + } elsif ($rItem->[0] eq '@') { $sRep = $iData; } -#print "REP:$sRep ",$rItem->[0], ":", $rItem->[1], ":" ,$rItem->[2], "\n"; + #print "REP:$sRep ",$rItem->[0], ":", $rItem->[1], ":" ,$rItem->[2], "\n"; substr($sFmtRes, $rItem->[1], $rItem->[2]) = $sRep; } - } - elsif(($iFmtMode==1)&& ($iData =~/$sNUMEXP/)) { - if($#aRep>=0) { - while($aRep[$#aRep]->[0] eq ',') { + } elsif (($iFmtMode == 1) && ($iData =~ /$sNUMEXP/)) { + if ($#aRep >= 0) { + while ($aRep[$#aRep]->[0] eq ',') { $iCmmCnt--; substr($sFmtRes, $aRep[$#aRep]->[1], $aRep[$#aRep]->[2]) = ''; $iData /= 1000; @@ -492,362 +433,354 @@ sub ExcelFmt { my $sNumFmt = join('', map {$_->[0]} @aRep); my $sNumRes; - my $iTtl=0; - my $iE=0; - my $iP=0; - my $iInt = 0; - my $iAftP=undef; + my $iTtl = 0; + my $iE = 0; + my $iP = 0; + my $iInt = 0; + my $iAftP = undef; foreach my $sItem (split //, $sNumFmt) { - if($sItem eq '.') { + if ($sItem eq '.') { $iTtl++; $iP = 1; - } - elsif(($sItem eq 'E') || ($sItem eq 'e')){ + } elsif (($sItem eq 'E') || ($sItem eq 'e')) { $iE = 1; - } - elsif($sItem eq '0') { + } elsif ($sItem eq '0') { $iTtl++; - $iAftP++ if($iP); + $iAftP++ if ($iP); $iInt = 1; - } - elsif($sItem eq '#') { + } elsif ($sItem eq '#') { + #$iTtl++; - $iAftP++ if($iP); + $iAftP++ if ($iP); $iInt = 1; - } - elsif($sItem eq '?') { + } elsif ($sItem eq '?') { + #$iTtl++; - $iAftP++ if($iP); + $iAftP++ if ($iP); } } - $iData *= 100.0 if($iPer); - my $iDData = ($iFugouFlg)? abs($iData) : $iData+0; - if($iBunFlg) { + $iData *= 100.0 if ($iPer); + my $iDData = ($iFugouFlg) ? abs($iData) : $iData + 0; + if ($iBunFlg) { $sNumRes = sprintf("%0${iTtl}d", int($iDData)); - } - else { - if($iP) { - $sNumRes = sprintf( - (defined($iAftP)? - "%0${iTtl}.${iAftP}f": "%0${iTtl}f"), $iDData); - } - else { + } else { + if ($iP) { + $sNumRes = sprintf((defined($iAftP) ? "%0${iTtl}.${iAftP}f" : "%0${iTtl}f"), $iDData); + } else { $sNumRes = sprintf("%0${iTtl}.0f", $iDData); } } - $sNumRes = AddComma($sNumRes) if($iCmmCnt > 0); - my $iLen = length($sNumRes); + $sNumRes = AddComma($sNumRes) if ($iCmmCnt > 0); + my $iLen = length($sNumRes); my $iPPos = -1; my $sRep; - for(my $iIt=$#aRep; $iIt>=0;$iIt--) { + for (my $iIt = $#aRep ; $iIt >= 0 ; $iIt--) { my $rItem = $aRep[$iIt]; - if($rItem->[0] =~/([#0]*)([\.]?)([0#]*)([eE])([\+\-])([0#]+)/) { - substr($sFmtRes, $rItem->[1], $rItem->[2]) = - MakeE($rItem->[0], $iData); - } - elsif($rItem->[0] =~ /\//) { - substr($sFmtRes, $rItem->[1], $rItem->[2]) = - MakeBun($rItem->[0], $iData, $iInt); - } - elsif($rItem->[0] eq '.') { + if ($rItem->[0] =~ /([#0]*)([\.]?)([0#]*)([eE])([\+\-])([0#]+)/) { + substr($sFmtRes, $rItem->[1], $rItem->[2]) = + MakeE($rItem->[0], $iData); + } elsif ($rItem->[0] =~ /\//) { + substr($sFmtRes, $rItem->[1], $rItem->[2]) = + MakeBun($rItem->[0], $iData, $iInt); + } elsif ($rItem->[0] eq '.') { $iLen--; - $iPPos=$iLen; - } - elsif($rItem->[0] eq '+') { - substr($sFmtRes, $rItem->[1], $rItem->[2]) = - ($iData > 0)? '+': (($iData==0)? '+':'-'); - } - elsif($rItem->[0] eq '-') { - substr($sFmtRes, $rItem->[1], $rItem->[2]) = - ($iData > 0)? '': (($iData==0)? '':'-'); - } - elsif($rItem->[0] eq '@') { + $iPPos = $iLen; + } elsif ($rItem->[0] eq '+') { + substr($sFmtRes, $rItem->[1], $rItem->[2]) = + ($iData > 0) ? '+' : (($iData == 0) ? '+' : '-'); + } elsif ($rItem->[0] eq '-') { + substr($sFmtRes, $rItem->[1], $rItem->[2]) = + ($iData > 0) ? '' : (($iData == 0) ? '' : '-'); + } elsif ($rItem->[0] eq '@') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $iData; - } - elsif($rItem->[0] eq '*') { - substr($sFmtRes, $rItem->[1], $rItem->[2]) = ''; #REMOVE - } - elsif(($rItem->[0] eq "\xA2\xA4") or ($rItem->[0] eq "\xA2\xA5") or - ($rItem->[0] eq "\x81\xA2") or ($rItem->[0] eq "\x81\xA3") ){ + } elsif ($rItem->[0] eq '*') { + substr($sFmtRes, $rItem->[1], $rItem->[2]) = ''; #REMOVE + } elsif (($rItem->[0] eq "\xA2\xA4") + or ($rItem->[0] eq "\xA2\xA5") + or ($rItem->[0] eq "\x81\xA2") + or ($rItem->[0] eq "\x81\xA3")) { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $rItem->[0]; - } - elsif(($rItem->[0] eq '(') or ($rItem->[0] eq ')')){ + } elsif (($rItem->[0] eq '(') or ($rItem->[0] eq ')')) { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $rItem->[0]; - } - else { - if($iLen>0) { - if($iIt <= 0) { + } else { + if ($iLen > 0) { + if ($iIt <= 0) { $sRep = substr($sNumRes, 0, $iLen); $iLen = 0; - } - else { + } else { my $iReal = length($rItem->[0]); - if($iPPos >= 0) { + if ($iPPos >= 0) { my $sWkF = $rItem->[0]; - $sWkF=~s/^#+//; + $sWkF =~ s/^#+//; $iReal = length($sWkF); - $iReal = ($iLen <=$iReal)? $iLen:$iReal; - } - else { - $iReal = ($iLen <=$iReal)? $iLen:$iReal; + $iReal = ($iLen <= $iReal) ? $iLen : $iReal; + } else { + $iReal = ($iLen <= $iReal) ? $iLen : $iReal; } $sRep = substr($sNumRes, $iLen - $iReal, $iReal); - $iLen -=$iReal; + $iLen -= $iReal; } - } - else { - $sRep = ''; + } else { + $sRep = ''; } substr($sFmtRes, $rItem->[1], $rItem->[2]) = "\x00" . $sRep; } } - $sRep = ($iLen > 0)?substr($sNumRes, 0, $iLen) : ''; + $sRep = ($iLen > 0) ? substr($sNumRes, 0, $iLen) : ''; $sFmtRes =~ s/\x00/$sRep/; $sFmtRes =~ s/\x00//g; } - } - else { - my $iAtMk = 0; - for(my $iIt=$#aRep; $iIt>=0;$iIt--) { + } else { + my $iAtMk = 0; + for (my $iIt = $#aRep ; $iIt >= 0 ; $iIt--) { my $rItem = $aRep[$iIt]; - if($rItem->[0] eq '@') { + if ($rItem->[0] eq '@') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $iData; $iAtMk++; - } - else { + } else { substr($sFmtRes, $rItem->[1], $rItem->[2]) = ''; } } - $sFmtRes = $iData unless($iAtMk); + $sFmtRes = $iData unless ($iAtMk); } - return wantarray()? ($sFmtRes, $sColor) : $sFmtRes; + return wantarray() ? ($sFmtRes, $sColor) : $sFmtRes; } + #------------------------------------------------------------------------------ # AddComma (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub AddComma { - my($sNum) = @_; + my ($sNum) = @_; - if($sNum=~ /^([^\d]*)(\d\d\d\d+)(\.*.*)$/) { - my($sPre, $sObj, $sAft) =($1, $2, $3); - for(my $i=length($sObj)-3;$i>0; $i-=3) { + if ($sNum =~ /^([^\d]*)(\d\d\d\d+)(\.*.*)$/) { + my ($sPre, $sObj, $sAft) = ($1, $2, $3); + for (my $i = length($sObj) - 3 ; $i > 0 ; $i -= 3) { substr($sObj, $i, 0) = ','; } return $sPre . $sObj . $sAft; - } - else { + } else { return $sNum; } } + #------------------------------------------------------------------------------ # MakeBun (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub MakeBun { - my($sFmt, $iData, $iFlg) = @_; + my ($sFmt, $iData, $iFlg) = @_; my $iBunbo; my $iShou; -#1. Init -#print "FLG: $iFlg\n"; - if($iFlg) { + #1. Init + #print "FLG: $iFlg\n"; + if ($iFlg) { $iShou = $iData - int($iData); - return '' if($iShou == 0); - } - else { + return '' if ($iShou == 0); + } else { $iShou = $iData; } $iShou = abs($iShou); my $sSWk; -#2.Calc BUNBO -#2.1 BUNBO defined - if($sFmt =~ /\/(\d+)$/) { + #2.Calc BUNBO + #2.1 BUNBO defined + if ($sFmt =~ /\/(\d+)$/) { $iBunbo = $1; - return sprintf("%d/%d", $iShou*$iBunbo, $iBunbo); - } - else { -#2.2 Calc BUNBO + return sprintf("%d/%d", $iShou * $iBunbo, $iBunbo); + } else { + + #2.2 Calc BUNBO $sFmt =~ /\/(\?+)$/; my $iKeta = length($1); - my $iSWk = 1; - my $sSWk = ''; + my $iSWk = 1; + my $sSWk = ''; my $iBunsi; - for(my $iBunbo = 2;$iBunbo<10**$iKeta;$iBunbo++) { - $iBunsi = int($iShou*$iBunbo + 0.5); - my $iCmp = abs($iShou - ($iBunsi/$iBunbo)); - if($iCmp < $iSWk) { - $iSWk =$iCmp; + for (my $iBunbo = 2 ; $iBunbo < 10**$iKeta ; $iBunbo++) { + $iBunsi = int($iShou * $iBunbo + 0.5); + my $iCmp = abs($iShou - ($iBunsi / $iBunbo)); + if ($iCmp < $iSWk) { + $iSWk = $iCmp; $sSWk = sprintf("%d/%d", $iBunsi, $iBunbo); - last if($iSWk==0); + last if ($iSWk == 0); } } return $sSWk; } } + #------------------------------------------------------------------------------ # MakeE (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub MakeE { - my($sFmt, $iData) = @_; + my ($sFmt, $iData) = @_; - $sFmt=~/(([#0]*)[\.]?[#0]*)([eE])([\+\-][0#]+)/; - my($sKari, $iKeta, $sE, $sSisu) = ($1, length($2), $3, $4); - $iKeta = 1 if($iKeta<=0); + $sFmt =~ /(([#0]*)[\.]?[#0]*)([eE])([\+\-][0#]+)/; + my ($sKari, $iKeta, $sE, $sSisu) = ($1, length($2), $3, $4); + $iKeta = 1 if ($iKeta <= 0); my $iLog10 = 0; - $iLog10 = ($iData == 0)? 0 : (log(abs($iData))/ log(10)); - $iLog10 = (int($iLog10 / $iKeta) + - ((($iLog10 - int($iLog10 / $iKeta))<0)? -1: 0)) *$iKeta; + $iLog10 = ($iData == 0) ? 0 : (log(abs($iData)) / log(10)); + $iLog10 = (int($iLog10 / $iKeta) + ((($iLog10 - int($iLog10 / $iKeta)) < 0) ? -1 : 0)) * $iKeta; - my $sUe = ExcelFmt($sKari, $iData*(10**($iLog10*-1)),0); + my $sUe = ExcelFmt($sKari, $iData * (10**($iLog10 * -1)), 0); my $sShita = ExcelFmt($sSisu, $iLog10, 0); return $sUe . $sE . $sShita; } + #------------------------------------------------------------------------------ # LeapYear (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub LeapYear { - my($iYear)=@_; - return 1 if($iYear==1900); #Special for Excel - return ((($iYear % 4)==0) && (($iYear % 100) || ($iYear % 400)==0))? 1: 0; + my ($iYear) = @_; + return 1 if ($iYear == 1900); #Special for Excel + return ((($iYear % 4) == 0) && (($iYear % 100) || ($iYear % 400) == 0)) ? 1 : 0; } + #------------------------------------------------------------------------------ # LocaltimeExcel (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub LocaltimeExcel { - my($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iMSec, $flg1904) = @_; + my ($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iMSec, $flg1904) = @_; -#0. Init + #0. Init $iMon++; - $iYear+=1900; + $iYear += 1900; -#1. Calc Time + #1. Calc Time my $iTime; - $iTime =$iHour; - $iTime *=60; - $iTime +=$iMin; - $iTime *=60; - $iTime +=$iSec; - $iTime += $iMSec/1000.0 if(defined($iMSec)) ; - $iTime /= 86400.0; #3600*24(1day in seconds) + $iTime = $iHour; + $iTime *= 60; + $iTime += $iMin; + $iTime *= 60; + $iTime += $iSec; + $iTime += $iMSec / 1000.0 if (defined($iMSec)); + $iTime /= 86400.0; #3600*24(1day in seconds) my $iY; my $iYDays; -#2. Calc Days - if($flg1904) { + #2. Calc Days + if ($flg1904) { $iY = 1904; $iTime--; #Start from Jan 1st $iYDays = 366; + } else { + $iY = 1900; + $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) } - else { - $iY = 1900; - $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) - } - while($iY<$iYear) { + while ($iY < $iYear) { $iTime += $iYDays; $iY++; - $iYDays = (LeapYear($iY))? 366: 365; + $iYDays = (LeapYear($iY)) ? 366 : 365; } - for(my $iM=1;$iM < $iMon; $iM++){ - if($iM == 1 || $iM == 3 || $iM == 5 || $iM == 7 || $iM == 8 - || $iM == 10 || $iM == 12) { + for (my $iM = 1 ; $iM < $iMon ; $iM++) { + if ( $iM == 1 + || $iM == 3 + || $iM == 5 + || $iM == 7 + || $iM == 8 + || $iM == 10 + || $iM == 12) { $iTime += 31; - } - elsif($iM == 4 || $iM == 6 || $iM == 9 || $iM == 11) { + } elsif ($iM == 4 || $iM == 6 || $iM == 9 || $iM == 11) { $iTime += 30; - } - elsif($iM == 2) { - $iTime += (LeapYear($iYear))? 29: 28; + } elsif ($iM == 2) { + $iTime += (LeapYear($iYear)) ? 29 : 28; } } - $iTime+=$iDay; + $iTime += $iDay; return $iTime; } + #------------------------------------------------------------------------------ # ExcelLocaltime (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub ExcelLocaltime { - my($dObj, $flg1904) = @_; - my($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iwDay, $iMSec); - my($iDt, $iTime, $iYDays); - - $iDt = int($dObj); - $iTime = $dObj - $iDt; - -#1. Calc Days - if($flg1904) { - $iYear = 1904; - $iDt++; #Start from Jan 1st - $iYDays = 366; - $iwDay = (($iDt+4) % 7); - } - else { - $iYear = 1900; - $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) - $iwDay = (($iDt+6) % 7); - } - while($iDt > $iYDays) { - $iDt -= $iYDays; - $iYear++; - $iYDays = ((($iYear % 4)==0) && - (($iYear % 100) || ($iYear % 400)==0))? 366: 365; - } - $iYear -= 1900; - for($iMon=1;$iMon < 12; $iMon++){ - my $iMD; - if($iMon == 1 || $iMon == 3 || $iMon == 5 || $iMon == 7 || $iMon == 8 - || $iMon == 10 || $iMon == 12) { - $iMD = 31; + my ($dObj, $flg1904) = @_; + my ($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iwDay, $iMSec); + my ($iDt, $iTime, $iYDays); + + $iDt = int($dObj); + $iTime = $dObj - $iDt; + + #1. Calc Days + if ($flg1904) { + $iYear = 1904; + $iDt++; #Start from Jan 1st + $iYDays = 366; + $iwDay = (($iDt + 4) % 7); + } else { + $iYear = 1900; + $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) + $iwDay = (($iDt + 6) % 7); } - elsif($iMon == 4 || $iMon == 6 || $iMon == 9 || $iMon == 11) { - $iMD = 30; + while ($iDt > $iYDays) { + $iDt -= $iYDays; + $iYear++; + $iYDays = + ((($iYear % 4) == 0) && (($iYear % 100) || ($iYear % 400) == 0)) ? 366 : 365; } - elsif($iMon == 2) { - $iMD = (($iYear % 4) == 0)? 29: 28; + $iYear -= 1900; + for ($iMon = 1 ; $iMon < 12 ; $iMon++) { + my $iMD; + if ( $iMon == 1 + || $iMon == 3 + || $iMon == 5 + || $iMon == 7 + || $iMon == 8 + || $iMon == 10 + || $iMon == 12) { + $iMD = 31; + } elsif ($iMon == 4 || $iMon == 6 || $iMon == 9 || $iMon == 11) { + $iMD = 30; + } elsif ($iMon == 2) { + $iMD = (($iYear % 4) == 0) ? 29 : 28; + } + last if ($iDt <= $iMD); + $iDt -= $iMD; } - last if($iDt <= $iMD); - $iDt -= $iMD; - } - -#2. Calc Time - $iDay = $iDt; - $iTime += (0.0005 / 86400.0); - $iTime*=24.0; - $iHour = int($iTime); - $iTime -= $iHour; - $iTime *= 60.0; - $iMin = int($iTime); - $iTime -= $iMin; - $iTime *= 60.0; - $iSec = int($iTime); - $iTime -= $iSec; - $iTime *= 1000.0; - $iMSec = int($iTime); - - return ($iSec, $iMin, $iHour, $iDay, $iMon-1, $iYear, $iwDay, $iMSec); + + #2. Calc Time + $iDay = $iDt; + $iTime += (0.0005 / 86400.0); + $iTime *= 24.0; + $iHour = int($iTime); + $iTime -= $iHour; + $iTime *= 60.0; + $iMin = int($iTime); + $iTime -= $iMin; + $iTime *= 60.0; + $iSec = int($iTime); + $iTime -= $iSec; + $iTime *= 1000.0; + $iMSec = int($iTime); + + return ($iSec, $iMin, $iHour, $iDay, $iMon - 1, $iYear, $iwDay, $iMSec); } + # ----------------------------------------------------------------------------- # col2int (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ # converts a excel row letter into an int for use in an array sub col2int { - my $result = 0 ; - my $str = shift ; - my $incr = 0 ; + my $result = 0; + my $str = shift; + my $incr = 0; - for(my $i = length($str) ; $i > 0 ; $i--) { - my $char = substr( $str, $i-1) ; + for (my $i = length($str) ; $i > 0 ; $i--) { + my $char = substr($str, $i - 1); my $curr += ord(lc($char)) - ord('a') + 1; - $curr *= $incr if( $incr) ; - $result += $curr ; - $incr += 26 ; + $curr *= $incr if ($incr); + $result += $curr; + $incr += 26; } + # this is one out as we range 0..x-1 not 1..x - $result-- ; + $result--; - return $result ; + return $result; } + # ----------------------------------------------------------------------------- # int2col (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ @@ -859,16 +792,17 @@ sub col2int { # @returns string, column name # sub int2col { - my $out = "" ; - my $val = shift ; - - do { - $out .= chr(( $val % 26) + ord('A')) ; - $val = int( $val / 26) - 1 ; - } while( $val >= 0) ; - - return reverse $out ; + my $out = ""; + my $val = shift; + + do { + $out .= chr(($val % 26) + ord('A')); + $val = int($val / 26) - 1; + } while ($val >= 0); + + return reverse $out; } + # ----------------------------------------------------------------------------- # sheetRef (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ @@ -880,20 +814,21 @@ sub int2col { # @returns an array - 2 elements - column, row, or undefined # sub sheetRef { - my $str = shift ; - my @ret ; + my $str = shift; + my @ret; - $str =~ m/^(\D+)(\d+)$/ ; + $str =~ m/^(\D+)(\d+)$/; - if( $1 && $2) { - push( @ret, $2 -1, col2int($1)) ; + if ($1 && $2) { + push(@ret, $2 - 1, col2int($1)); } - if( $ret[0] < 0) { - undef @ret ; + if ($ret[0] < 0) { + undef @ret; } - return @ret ; + return @ret; } + # ----------------------------------------------------------------------------- # xls2csv (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ @@ -904,124 +839,125 @@ sub sheetRef { # @returns string containing a chunk of csv # sub xls2csv { - my ($filename, $regions, $rotate) = @_ ; - my $sheet = 0 ; - my $output = "" ; - - # extract any sheet number from the region string - $regions =~ m/^(\d+)-(.*)/ ; - - if( $2) { - $sheet = $1 - 1 ; - $regions = $2 ; + my ($filename, $regions, $rotate) = @_; + my $sheet = 0; + my $output = ""; + + # extract any sheet number from the region string + $regions =~ m/^(\d+)-(.*)/; + + if ($2) { + $sheet = $1 - 1; + $regions = $2; } # now extract the start and end regions - $regions =~ m/(.*):(.*)/ ; + $regions =~ m/(.*):(.*)/; - if( !$1 || !$2) { + if (!$1 || !$2) { print STDERR "Bad Params"; - return "" ; + return ""; } - my @start = sheetRef( $1) ; - my @end = sheetRef( $2) ; - if( !@start) { + my @start = sheetRef($1); + my @end = sheetRef($2); + if (!@start) { print STDERR "Bad coorinates - $1"; - return "" ; - } - if( !@end) { + return ""; + } + if (!@end) { print STDERR "Bad coorinates - $2"; - return "" ; - } - - if( $start[1] > $end[1]) { + return ""; + } + + if ($start[1] > $end[1]) { print STDERR "Bad COLUMN ordering\n"; print STDERR "Start column " . int2col($start[1]); print STDERR " after end column " . int2col($end[1]) . "\n"; - return "" ; - } - if( $start[0] > $end[0]) { + return ""; + } + if ($start[0] > $end[0]) { print STDERR "Bad ROW ordering\n"; print STDERR "Start row " . ($start[0] + 1); print STDERR " after end row " . ($end[0] + 1) . "\n"; - exit ; - } - - # start the excel object now - my $oExcel = new Spreadsheet::XLSX ; - my $oBook = $oExcel->Parse( $filename) ; - # open the sheet - my $oWkS = $oBook->{Worksheet}[ $sheet] ; - - # now check that the region exists in the file - # if not trucate to the possible region - # output a warning msg - if( $start[1] < $oWkS->{MinCol}) { - print STDERR int2col( $start[1]) . " < min col " . int2col( $oWkS->{MinCol}) . " Reseting\n"; - $start[1] = $oWkS->{MinCol} ; - } - if( $end[1] > $oWkS->{MaxCol}) { - print STDERR int2col( $end[1]) . " > max col " . int2col( $oWkS->{MaxCol}) . " Reseting\n" ; - $end[1] = $oWkS->{MaxCol} ; - } - if( $start[0] < $oWkS->{MinRow}) { + exit; + } + + # start the excel object now + my $oExcel = new Spreadsheet::XLSX; + my $oBook = $oExcel->Parse($filename); + + # open the sheet + my $oWkS = $oBook->{Worksheet}[$sheet]; + + # now check that the region exists in the file + # if not trucate to the possible region + # output a warning msg + if ($start[1] < $oWkS->{MinCol}) { + print STDERR int2col($start[1]) . " < min col " . int2col($oWkS->{MinCol}) . " Reseting\n"; + $start[1] = $oWkS->{MinCol}; + } + if ($end[1] > $oWkS->{MaxCol}) { + print STDERR int2col($end[1]) . " > max col " . int2col($oWkS->{MaxCol}) . " Reseting\n"; + $end[1] = $oWkS->{MaxCol}; + } + if ($start[0] < $oWkS->{MinRow}) { print STDERR "" . ($start[0] + 1) . " < min row " . ($oWkS->{MinRow} + 1) . " Reseting\n"; - $start[0] = $oWkS->{MinCol} ; - } - if( $end[0] > $oWkS->{MaxRow}) { + $start[0] = $oWkS->{MinCol}; + } + if ($end[0] > $oWkS->{MaxRow}) { print STDERR "" . ($end[0] + 1) . " > max row " . ($oWkS->{MaxRow} + 1) . " Reseting\n"; - $end[0] = $oWkS->{MaxRow} ; - - } - - my $x1 = $start[1] ; - my $y1 = $start[0] ; - my $x2 = $end[1] ; - my $y2 = $end[0] ; - - if( !$rotate) { - for( my $y = $y1 ; $y <= $y2 ; $y++) { - for( my $x = $x1 ; $x <= $x2 ; $x++) { - my $cell = $oWkS->{Cells}[$y][$x] ; - $output .= $cell->Value if(defined $cell); - $output .= "," if( $x != $x2) ; - } - $output .= "\n" ; + $end[0] = $oWkS->{MaxRow}; + } - } else { - for( my $x = $x1 ; $x <= $x2 ; $x++) { - for( my $y = $y1 ; $y <= $y2 ; $y++) { - my $cell = $oWkS->{Cells}[$y][$x] ; - $output .= $cell->Value if(defined $cell); - $output .= "," if( $y != $y2) ; - } - $output .= "\n" ; + + my $x1 = $start[1]; + my $y1 = $start[0]; + my $x2 = $end[1]; + my $y2 = $end[0]; + + if (!$rotate) { + for (my $y = $y1 ; $y <= $y2 ; $y++) { + for (my $x = $x1 ; $x <= $x2 ; $x++) { + my $cell = $oWkS->{Cells}[$y][$x]; + $output .= $cell->Value if (defined $cell); + $output .= "," if ($x != $x2); + } + $output .= "\n"; + } + } else { + for (my $x = $x1 ; $x <= $x2 ; $x++) { + for (my $y = $y1 ; $y <= $y2 ; $y++) { + my $cell = $oWkS->{Cells}[$y][$x]; + $output .= $cell->Value if (defined $cell); + $output .= "," if ($y != $y2); + } + $output .= "\n"; + } } - } - - return $output ; + + return $output; } -sub unescape_HTML { - my $string = shift; - my %options = @_; +sub unescape_HTML { - return $string if ($string eq ''); + my $string = shift; + my %options = @_; - $string =~ s/"/"/g; - $string =~ s/’/'/g; - $string =~ s/&/&/g; + return $string if ($string eq ''); - return $string if $options{textarea}; # for textboxes, we leave < and > as < and > - # so that people who enter "</textarea>" into - # our text boxes can't break forms + $string =~ s/"/"/g; + $string =~ s/’/'/g; + $string =~ s/&/&/g; - $string =~ s/</</g; - $string =~ s/>/>/g; + return $string if $options{textarea}; # for textboxes, we leave < and > as < and > + # so that people who enter "</textarea>" into + # our text boxes can't break forms + $string =~ s/</</g; + $string =~ s/>/>/g; - return $string; + return $string; } 1; diff --git a/t/1_____loreyna126.t b/t/1_____loreyna126.t index ebc4b32..6ae54ba 100755 --- a/t/1_____loreyna126.t +++ b/t/1_____loreyna126.t @@ -1,19 +1,19 @@ -use Test::More tests => 3; - -BEGIN { - - use Spreadsheet::XLSX; - use warnings; - - my $fn = __FILE__; - - $fn =~ s{t$}{xlsx}; - - my $excel = Spreadsheet::XLSX -> new ($fn); - - ok (@{$excel -> {Worksheet}} == 3); - ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'POST_DSENDS'); - ok ($excel -> {Worksheet} -> [0] -> {Cells} [112] [0] -> {Val} eq 'RCS Thrust Vector Uncertainties '); - -}; +use Test::More tests => 3; + +BEGIN { + + use Spreadsheet::XLSX; + use warnings; + + my $fn = __FILE__; + + $fn =~ s{t$}{xlsx}; + + my $excel = Spreadsheet::XLSX -> new ($fn); + + ok (@{$excel -> {Worksheet}} == 3); + ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'POST_DSENDS'); + ok ($excel -> {Worksheet} -> [0] -> {Cells} [112] [0] -> {Val} eq 'RCS Thrust Vector Uncertainties '); + +}; \ No newline at end of file diff --git a/t/2_____with_chart.t b/t/2_____with_chart.t index bc8d8a2..3987e7d 100755 --- a/t/2_____with_chart.t +++ b/t/2_____with_chart.t @@ -1,22 +1,22 @@ -use Test::More tests => 6; - -BEGIN { - - use Spreadsheet::XLSX; - use warnings; - - my $fn = __FILE__; - - $fn =~ s{t$}{xlsx}; - - my $excel = Spreadsheet::XLSX -> new ($fn); - - ok (@{$excel -> {Worksheet}} == 4); - ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'Tabelle1'); - ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [0] -> {Val} == 1); - ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [1] -> {Val} == 10); - ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [0] -> {Val} == 2); - ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [1] -> {Val} == 20); - -}; +use Test::More tests => 6; + +BEGIN { + + use Spreadsheet::XLSX; + use warnings; + + my $fn = __FILE__; + + $fn =~ s{t$}{xlsx}; + + my $excel = Spreadsheet::XLSX -> new ($fn); + + ok (@{$excel -> {Worksheet}} == 4); + ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'Tabelle1'); + ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [0] -> {Val} == 1); + ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [1] -> {Val} == 10); + ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [0] -> {Val} == 2); + ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [1] -> {Val} == 20); + +}; \ No newline at end of file diff --git a/t/empty_v_tag.t b/t/empty_v_tag.t new file mode 100755 index 0000000..7f08a6e --- /dev/null +++ b/t/empty_v_tag.t @@ -0,0 +1,13 @@ +use Test::More tests => 1; +use Test::NoWarnings; + +BEGIN { + + use Spreadsheet::XLSX; + use warnings; + + my $fn = __FILE__; + $fn =~ s{t$}{xlsx}; + + my $excel = Spreadsheet::XLSX->new($fn); +}; diff --git a/t/empty_v_tag.xlsx b/t/empty_v_tag.xlsx new file mode 100644 index 0000000..551dd76 Binary files /dev/null and b/t/empty_v_tag.xlsx differ diff --git a/t/formats.t b/t/formats.t new file mode 100755 index 0000000..bf866b9 --- /dev/null +++ b/t/formats.t @@ -0,0 +1,24 @@ +use Test::More tests => 10; + +BEGIN { + + use Spreadsheet::XLSX; + use warnings; + + my $fn = __FILE__; + $fn =~ s{t$}{xlsx}; + + my $excel = Spreadsheet::XLSX->new($fn); + my $cells = $excel->{Worksheet}[0]{Cells}; + ok ($cells->[0][0]->value() eq '2015-12-31', 'formatted date'); + ok ($cells->[0][1]->value() eq '23:59', 'formatted time'); + ok ($cells->[0][2]->value() eq '1.12', 'formatted default numeric'); + ok ($cells->[0][2]->unformatted() eq '1.125', 'unformatted default numeric'); + ok ($cells->[0][3]->value() eq '1.12', 'formatted 2-digit numeric'); + ok ($cells->[0][3]->unformatted() eq '1.125', 'unformatted 2-digit numeric'); + ok ($cells->[0][4]->value() eq 'Test', 'formatted default text'); + ok ($cells->[0][4]->unformatted() eq 'Test', 'unformatted default text'); + ok ($cells->[0][5]->value() eq '1.2345', 'formatted number in text field'); + ok ($cells->[0][5]->unformatted() eq '1.2345', 'unformatted number in text field'); +}; + diff --git a/t/formats.xlsx b/t/formats.xlsx new file mode 100755 index 0000000..edde219 Binary files /dev/null and b/t/formats.xlsx differ diff --git a/t/kwalitee.t b/t/kwalitee.t new file mode 100644 index 0000000..be2eed4 --- /dev/null +++ b/t/kwalitee.t @@ -0,0 +1,9 @@ +use Test::More; +BEGIN { + plan skip_all => 'these tests are for release candidate testing' + unless $ENV{RELEASE_TESTING}; +} + +use Test::Kwalitee 'kwalitee_ok'; +kwalitee_ok(); +done_testing; diff --git a/t/missing_styles.t b/t/missing_styles.t new file mode 100755 index 0000000..7f08a6e --- /dev/null +++ b/t/missing_styles.t @@ -0,0 +1,13 @@ +use Test::More tests => 1; +use Test::NoWarnings; + +BEGIN { + + use Spreadsheet::XLSX; + use warnings; + + my $fn = __FILE__; + $fn =~ s{t$}{xlsx}; + + my $excel = Spreadsheet::XLSX->new($fn); +}; diff --git a/t/missing_styles.xlsx b/t/missing_styles.xlsx new file mode 100644 index 0000000..4ac6671 Binary files /dev/null and b/t/missing_styles.xlsx differ -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libspreadsheet-xlsx-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits