File Coverage

blib/lib/Spreadsheet/ParseExcel/FmtDefault.pm
Criterion Covered Total %
statement 42 51 82.3
branch 16 26 61.5
condition 15 18 83.3
subroutine 9 9 100.0
pod 0 6 0.0
total 82 110 74.5


line stmt bran cond sub pod time code
1             package Spreadsheet::ParseExcel::FmtDefault;
2              
3             ###############################################################################
4             #
5             # Spreadsheet::ParseExcel::FmtDefault - A class for Cell formats.
6             #
7             # Used in conjunction with Spreadsheet::ParseExcel.
8             #
9             # Copyright (c) 2014 Douglas Wilson
10             # Copyright (c) 2009-2013 John McNamara
11             # Copyright (c) 2006-2008 Gabor Szabo
12             # Copyright (c) 2000-2006 Kawai Takanori
13             #
14             # perltidy with standard settings.
15             #
16             # Documentation after __END__
17             #
18              
19 21     21   106 use strict;
  21         39  
  21         650  
20 21     21   101 use warnings;
  21         38  
  21         581  
21              
22 21     21   19577 use Spreadsheet::ParseExcel::Utility qw(ExcelFmt);
  21         83  
  21         21849  
23             our $VERSION = '0.65';
24              
25             my %hFmtDefault = (
26             0x00 => 'General',
27             0x01 => '0',
28             0x02 => '0.00',
29             0x03 => '#,##0',
30             0x04 => '#,##0.00',
31             0x05 => '($#,##0_);($#,##0)',
32             0x06 => '($#,##0_);[Red]($#,##0)',
33             0x07 => '($#,##0.00_);($#,##0.00_)',
34             0x08 => '($#,##0.00_);[Red]($#,##0.00_)',
35             0x09 => '0%',
36             0x0A => '0.00%',
37             0x0B => '0.00E+00',
38             0x0C => '# ?/?',
39             0x0D => '# ??/??',
40             0x0E => 'yyyy-mm-dd', # Was 'm-d-yy', which is bad as system default
41             0x0F => 'd-mmm-yy',
42             0x10 => 'd-mmm',
43             0x11 => 'mmm-yy',
44             0x12 => 'h:mm AM/PM',
45             0x13 => 'h:mm:ss AM/PM',
46             0x14 => 'h:mm',
47             0x15 => 'h:mm:ss',
48             0x16 => 'm-d-yy h:mm',
49              
50             #0x17-0x24 -- Differs in Natinal
51             0x25 => '(#,##0_);(#,##0)',
52             0x26 => '(#,##0_);[Red](#,##0)',
53             0x27 => '(#,##0.00);(#,##0.00)',
54             0x28 => '(#,##0.00);[Red](#,##0.00)',
55             0x29 => '_(*#,##0_);_(*(#,##0);_(*"-"_);_(@_)',
56             0x2A => '_($*#,##0_);_($*(#,##0);_(*"-"_);_(@_)',
57             0x2B => '_(*#,##0.00_);_(*(#,##0.00);_(*"-"??_);_(@_)',
58             0x2C => '_($*#,##0.00_);_($*(#,##0.00);_(*"-"??_);_(@_)',
59             0x2D => 'mm:ss',
60             0x2E => '[h]:mm:ss',
61             0x2F => 'mm:ss.0',
62             0x30 => '##0.0E+0',
63             0x31 => '@',
64             );
65              
66             #------------------------------------------------------------------------------
67             # new (for Spreadsheet::ParseExcel::FmtDefault)
68             #------------------------------------------------------------------------------
69             sub new {
70 37     37 0 123 my ( $sPkg, %hKey ) = @_;
71 37         96 my $oThis = {};
72 37         84 bless $oThis;
73 37         209 return $oThis;
74             }
75              
76             #------------------------------------------------------------------------------
77             # TextFmt (for Spreadsheet::ParseExcel::FmtDefault)
78             #------------------------------------------------------------------------------
79             sub TextFmt {
80 1215     1215 0 2938 my ( $oThis, $sTxt, $sCode ) = @_;
81 1215 100 100     7119 return $sTxt if ( ( !defined($sCode) ) || ( $sCode eq '_native_' ) );
82 365         18451 return pack( 'U*', unpack( 'n*', $sTxt ) );
83             }
84              
85             #------------------------------------------------------------------------------
86             # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault)
87             #------------------------------------------------------------------------------
88             sub FmtStringDef {
89 387     387 0 630 my ( $oThis, $iFmtIdx, $oBook, $rhFmt ) = @_;
90 387         763 my $sFmtStr = $oBook->{FormatStr}->{$iFmtIdx};
91              
92 387 100 100     1742 if ( !( defined($sFmtStr) ) && defined($rhFmt) ) {
93 56         111 $sFmtStr = $rhFmt->{$iFmtIdx};
94             }
95 387 100       1055 $sFmtStr = $hFmtDefault{$iFmtIdx} unless ($sFmtStr);
96 387         885 return $sFmtStr;
97             }
98              
99             #------------------------------------------------------------------------------
100             # FmtString (for Spreadsheet::ParseExcel::FmtDefault)
101             #------------------------------------------------------------------------------
102             sub FmtString {
103 387     387 0 561 my ( $oThis, $oCell, $oBook ) = @_;
104              
105 387         1616 my $sFmtStr =
106             $oThis->FmtStringDef( $oBook->{Format}[ $oCell->{FormatNo} ]->{FmtIdx},
107             $oBook );
108              
109             # Special case for cells that use Lotus123 style leading
110             # apostrophe to designate text formatting.
111 387 50       1389 if ( $oBook->{Format}[ $oCell->{FormatNo} ]->{Key123} ) {
112 0         0 $sFmtStr = '@';
113             }
114              
115 387 50       797 unless ( defined($sFmtStr) ) {
116 0 0       0 if ( $oCell->{Type} eq 'Numeric' ) {
    0          
117 0 0       0 if ( int( $oCell->{Val} ) != $oCell->{Val} ) {
118 0         0 $sFmtStr = '0.00';
119             }
120             else {
121 0         0 $sFmtStr = '0';
122             }
123             }
124             elsif ( $oCell->{Type} eq 'Date' ) {
125 0 0       0 if ( int( $oCell->{Val} ) <= 0 ) {
126 0         0 $sFmtStr = 'h:mm:ss';
127             }
128             else {
129 0         0 $sFmtStr = 'yyyy-mm-dd';
130             }
131             }
132             else {
133 0         0 $sFmtStr = '@';
134             }
135             }
136 387         773 return $sFmtStr;
137             }
138              
139             #------------------------------------------------------------------------------
140             # ValFmt (for Spreadsheet::ParseExcel::FmtDefault)
141             #------------------------------------------------------------------------------
142             sub ValFmt {
143 1122     1122 0 1520 my ( $oThis, $oCell, $oBook ) = @_;
144              
145 1122         1744 my ( $Dt, $iFmtIdx, $iNumeric, $Flg1904 );
146              
147 1122 100       2803 if ( $oCell->{Type} eq 'Text' ) {
148 737 100 66     5364 $Dt =
149             ( ( defined $oCell->{Val} ) && ( $oCell->{Val} ne '' ) )
150             ? $oThis->TextFmt( $oCell->{Val}, $oCell->{Code} )
151             : '';
152              
153 737         7077 return $Dt;
154             }
155             else {
156 385         716 $Dt = $oCell->{Val};
157 385         683 $Flg1904 = $oBook->{Flg1904};
158 385         874 my $sFmtStr = $oThis->FmtString( $oCell, $oBook );
159              
160 385         1389 return ExcelFmt( $sFmtStr, $Dt, $Flg1904, $oCell->{Type} );
161             }
162             }
163              
164             #------------------------------------------------------------------------------
165             # ChkType (for Spreadsheet::ParseExcel::FmtDefault)
166             #------------------------------------------------------------------------------
167             sub ChkType {
168 1122     1122 0 1727 my ( $oPkg, $iNumeric, $iFmtIdx ) = @_;
169 1122 100       2019 if ($iNumeric) {
170 385 100 100     2354 if ( ( ( $iFmtIdx >= 0x0E ) && ( $iFmtIdx <= 0x16 ) )
      66        
      66        
171             || ( ( $iFmtIdx >= 0x2D ) && ( $iFmtIdx <= 0x2F ) ) )
172             {
173 49         226 return "Date";
174             }
175             else {
176 336         1312 return "Numeric";
177             }
178             }
179             else {
180 737         2562 return "Text";
181             }
182             }
183              
184             1;
185              
186             __END__