File Coverage

blib/lib/Spreadsheet/XLSX/Reader/LibXML/FmtDefault.pm
Criterion Covered Total %
statement 26 47 55.3
branch 1 18 5.5
condition 0 3 0.0
subroutine 9 11 81.8
pod 3 3 100.0
total 39 82 47.5


line stmt bran cond sub pod time code
1             package Spreadsheet::XLSX::Reader::LibXML::FmtDefault;
2             our $AUTHORITY = 'cpan:JANDREW';
3 2     2   772658 use version; our $VERSION = version->declare('v0.38.20');
  2         6  
  2         18  
4             ###LogSD warn "You uncovered internal logging statements for Spreadsheet::XLSX::Reader::LibXML::FmtDefault-$VERSION";
5              
6 2     2   316 use 5.010;
  2         8  
7 2     2   13 use Moose;
  2         4  
  2         16  
8 2     2   14767 use Carp 'confess';
  2         4  
  2         140  
9 2     2   2143 use Encode qw(decode);
  2         22973  
  2         206  
10 2     2   58 use Types::Standard qw( HashRef is_ArrayRef is_HashRef Str is_StrictNum HasMethods Bool );
  2         4  
  2         34  
11 2     2   3150 use lib '../../../../../lib',;
  2         5  
  2         18  
12             ###LogSD use Log::Shiras::Telephone;
13             ###LogSD use Log::Shiras::UnhideDebug;
14             ###LogSD with 'Log::Shiras::LogSpace';
15             ###LogSD sub get_class_space{ 'ExcelFmtDefault' }
16              
17             #########1 Dispatch Tables 3#########4#########5#########6#########7#########8#########9
18              
19              
20              
21             #########1 Public Attributes 3#########4#########5#########6#########7#########8#########9
22              
23             has error_inst =>(
24             isa => HasMethods[qw(
25             error set_error clear_error
26             ) ],
27             handles =>[ qw(
28             error set_error clear_error
29             ) ],
30             writer => 'set_error_inst',
31             );
32              
33             has excel_region =>(
34             isa => Str,
35             default => 'en',
36             reader => 'get_excel_region',
37             writer => 'set_excel_region',
38             );
39             with 'Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings';#<--- NOTE: PLACED HERE FOR PREREQS
40            
41             has target_encoding =>(
42             isa => Str,
43             reader => 'get_target_encoding',
44             writer => 'set_target_encoding',
45             predicate => 'has_target_encoding',
46             );
47              
48             has dont_inherit =>(
49             isa => Bool,
50             reader => 'block_inherit',
51             default => 0,
52             );
53              
54             has defined_excel_translations =>(
55             isa => HashRef,
56             traits => ['Hash'],
57             default => sub{ {
58             0x00 => 'General',
59             0x01 => '0',
60             0x02 => '0.00',
61             0x03 => '#,##0',
62             0x04 => '#,##0.00',
63             0x05 => '$#,##0_);($#,##0)',
64             0x06 => '$#,##0_);[Red]($#,##0)',
65             0x07 => '$#,##0.00_);($#,##0.00)',
66             0x08 => '$#,##0.00_);[Red]($#,##0.00)',
67             0x09 => '0%',
68             0x0A => '0.00%',
69             0x0B => '0.00E+00',
70             0x0C => '# ?/?',
71             0x0D => '# ??/??',
72             0x0E => 'yyyy-mm-dd', # Was 'm-d-yy', which is bad as system default
73             0x0F => 'd-mmm-yy',
74             0x10 => 'd-mmm',
75             0x11 => 'mmm-yy',
76             0x12 => 'h:mm AM/PM',
77             0x13 => 'h:mm:ss AM/PM',
78             0x14 => 'h:mm',
79             0x15 => 'h:mm:ss',
80             0x16 => 'm-d-yy h:mm',
81             0x1F => '#,##0_);(#,##0)',
82             0x20 => '#,##0_);[Red](#,##0)',
83             0x21 => '#,##0.00_);(#,##0.00)',
84             0x22 => '#,##0.00_);[Red](#,##0.00)',
85             0x23 => '_(*#,##0_);_(*(#,##0);_(*"-"_);_(@_)',
86             0x24 => '_($*#,##0_);_($*(#,##0);_($*"-"_);_(@_)',
87             0x25 => '_(*#,##0.00_);_(*(#,##0.00);_(*"-"??_);_(@_)',
88             0x26 => '_($*#,##0.00_);_($*(#,##0.00);_($*"-"??_);_(@_)',
89             0x27 => 'mm:ss',
90             0x28 => '[h]:mm:ss',
91             0x29 => 'mm:ss.0',
92             0x2A => '##0.0E+0',
93             0x2B => '@',
94             0x31 => '@',
95             } },
96             handles =>{
97             _get_defined_excel_format => 'get',
98             _set_defined_excel_format => 'set',
99             total_defined_excel_formats => 'count',
100             },
101             );
102              
103             #########1 Public Methods 3#########4#########5#########6#########7#########8#########9
104              
105             sub get_defined_excel_format{
106 72     72 1 26971 my ( $self, $position, ) = @_;
107             ###LogSD my $phone = Log::Shiras::Telephone->new( name_space =>
108             ###LogSD $self->get_all_space . '::get_defined_excel_format', );
109             ###LogSD $phone->talk( level => 'info', message => [
110             ###LogSD "Getting the defined excel format for position: $position", ] );
111 72 50       243 my $int_value = ( $position =~ /0x/ ) ? hex( $position ) : $position;
112             ###LogSD $phone->talk( level => 'info', message => [
113             ###LogSD "..after int conversion: $int_value", ] );
114 72         5092 return $self->_get_defined_excel_format( $int_value );
115             }
116              
117             sub set_defined_excel_formats{
118 0     0 1   my ( $self, @args, ) = @_;
119             ###LogSD my $phone = Log::Shiras::Telephone->new( name_space =>
120             ###LogSD $self->get_all_space . '::set_defined_excel_format', );
121             ###LogSD $phone->talk( level => 'info', message => [
122             ###LogSD "Setting the defined excel format for the elements in ref: ", @args, ] );
123 0           my $position_ref;
124 0 0 0       if( @args > 1 and @args % 2 == 0 ){
125 0           $position_ref = { @args };
126             }else{
127 0           $position_ref = $args[0];
128             }
129 0 0         if( is_ArrayRef( $position_ref ) ){
    0          
130 0           my $x = -1;
131 0           for my $format_string ( @$position_ref ){
132 0           $x++;
133 0 0         next if !defined $format_string;
134             ###LogSD $phone->talk( level => 'info', message => [
135             ###LogSD "Setting position -$x- to format string: $format_string", ] );
136 0           $self->_set_defined_excel_format( $x => $format_string );
137             }
138             }elsif( is_HashRef( $position_ref ) ){
139 0           for my $key ( keys %$position_ref ){
140             ###LogSD $phone->talk( level => 'info', message => [
141             ###LogSD "Setting the defined excel format for position -$key- to : ", $position_ref->{$key}, ] );
142 0 0         my $int_value = ( $key =~ /0x/ ) ? hex( $key ) : $key;
143 0 0         confess "The key -$key- must translate to a number!" if !is_StrictNum( $int_value );
144             ###LogSD $phone->talk( level => 'info', message => [
145             ###LogSD "Initial -$key- translated to position: " . $int_value, ] );
146 0           $self->_set_defined_excel_format( $int_value => $position_ref->{$key} );
147             }
148             }else{
149 0           confess "Unrecognized format passed: " . join( '~|~', @$position_ref );
150             }
151 0           return 1;
152             }
153              
154             sub change_output_encoding{
155 0     0 1   my ( $self, $string, ) = @_;
156 0 0         return undef if !defined $string;
157             ###LogSD my $phone = Log::Shiras::Telephone->new( name_space =>
158             ###LogSD $self->get_all_space . '::change_output_encoding', );
159             ###LogSD $phone->talk( level => 'info', message => [
160             ###LogSD "Changing the encoding of: $string",
161             ###LogSD ($self->has_target_encoding ? ('..to encoding type: ' . $self->get_target_encoding) : ''), ] );
162 0 0         my $output = $self->has_target_encoding ? decode( $self->get_target_encoding, $string ) : $string;
163             ###LogSD $phone->talk( level => 'info', message => [
164             ###LogSD "Final output: $output", ] );
165 0           return $output;
166             }
167              
168             #########1 Private Attributes 3#########4#########5#########6#########7#########8#########9
169              
170              
171              
172             #########1 Private Methods 3#########4#########5#########6#########7#########8#########9
173              
174              
175              
176             #########1 Phinish 3#########4#########5#########6#########7#########8#########9
177              
178 2     2   1747 no Moose;
  2         5  
  2         19  
179             __PACKAGE__->meta->make_immutable;
180            
181             1;
182              
183             #########1 Documentation 3#########4#########5#########6#########7#########8#########9
184             __END__
185              
186             =head1 NAME
187              
188             Spreadsheet::XLSX::Reader::LibXML::FmtDefault - Default xlsx number formats and localization
189              
190             =head1 PACKAGE SYNOPSIS
191              
192             #!/usr/bin/env perl
193             use Spreadsheet::XLSX::Reader::LibXML::FmtDefault;
194             use Spreadsheet::XLSX::Reader::LibXML;
195             my $formatter = Spreadsheet::XLSX::Reader::LibXML::FmtDefault->new(
196             target_encoding => 'latin1',
197             datetime_dates => 1,
198             dont_inherit => 1,
199             );
200             $formatter->set_defined_excel_formats( 0x2C => 'MyCoolFormatHere' );
201             my $parser = Spreadsheet::XLSX::Reader::LibXML->new;
202             my $workbook = $parser->parse( $file, $formatter );
203             $workbook = Spreadsheet::XLSX::Reader::LibXML->new(# This is an alternate way
204             file_name => $file,
205             formatter_inst => $formatter,
206             );
207            
208             =head1 PACKAGE DESCRIPTION
209              
210             If you wish to set attributes for the formatter class that are fixed and not inherited by the package
211             then you can build the formatter class with the attribute L<dont_inherit|/dont_inherit> set to 1 and then
212             pass that instance as either the second argument to the
213             L<Spreadsheet::XLSX::Reader::LibXML/parse( $file_nameE<verbar>$file_handle, $formatter )> command or to the
214             attribute L<Spreadsheet::XLSX::Reader::LibXML/formatter_inst> when calling new. The following formatter
215             attributes are inherited if 'dont_inherit' is not set. It should be noted that datetime_dates can be
216             set via a method L<inherited by the workbook|Spreadsheet::XLSX::Reader::LibXML/set_date_behavior>
217              
218             package => formatter
219             ################ ################
220             error_inst => error_inst
221             get_epoch_year (method) => epoch_year
222             cache_positions => cache_formats
223            
224             If you want to modify the default output formats you can do that here and they won't be
225             overwritten even if 'dont_inherit => 0'.
226            
227              
228             =head1 CLASS SYNOPSIS
229              
230             #!/usr/bin/env perl
231             use Spreadsheet::XLSX::Reader::LibXML::FmtDefault;
232             my $formatter = Spreadsheet::XLSX::Reader::LibXML::FmtDefault->new;
233             my $excel_format_string = $formatter->get_defined_excel_format( 0x0E );
234             print $excel_format_string . "\n";
235             $excel_format_string = $formatter->get_defined_excel_format( '0x0E' );
236             print $excel_format_string . "\n";
237             $excel_format_string = $formatter->get_defined_excel_format( 14 );
238             print $excel_format_string . "\n";
239             $formatter->set_defined_excel_formats( '0x17' => 'MySpecialFormat' );#Won't really translate!
240             $excel_format_string = $formatter->get_defined_excel_format( 23 );
241             print $excel_format_string . "\n";
242             my $conversion = $formatter->parse_excel_format_string( '[$-409]dddd, mmmm dd, yyyy;@' );
243             print 'For conversion named: ' . $conversion->name . "\n";
244             for my $unformatted_value ( '7/4/1776 11:00.234 AM', 0.112311 ){
245             print "Unformatted value: $unformatted_value\n";
246             print "..coerces to: " . $conversion->assert_coerce( $unformatted_value ) . "\n";
247             }
248              
249             ###########################
250             # SYNOPSIS Screen Output
251             # 01: yyyy-mm-dd
252             # 02: yyyy-mm-dd
253             # 03: yyyy-mm-dd
254             # 04: MySpecialFormat
255             # 05: For conversion named: DATESTRING_0
256             # 06: Unformatted value: 7/4/1776 11:00.234 AM
257             # 07: ..coerces to: Thursday, July 04, 1776
258             # 08: Unformatted value: 0.112311
259             # 09: ..coerces to: Friday, January 01, 1904
260             ###########################
261            
262             =head1 CLASS DESCRIPTION
263              
264             This documentation is written to explain the lesser used options and features of this class.
265             The general use of the main package is explained in the documentation for
266             L<Workbooks|Spreadsheet::XLSX::Reader::LibXML>. In general replacement of this class
267             requires replacement of the methods and attributes documented here and in
268             L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings>. The private methods
269             and attributes here (if any) are up to you. It is possible to replace only this class
270             and use the role ~::ParseExcelFormatStrings with it. Additionally while this class has
271             been changed from a role to better match the flow of L<Spreadsheet::ParseExcel> The actual
272             implementation is very different since the underlying architecture is different as
273             well. (The ~::ParseExcel equivalent is therefore not interchangeable)
274              
275             This class is the tool for number and string localization. It stores the number conversion
276             format strings and the code of the defined region. In this particular case this module is
277             set for the base L<english conversion
278             |http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2012/02/16/dates-in-spreadsheetml.aspx>
279             set. It does rely on L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings>
280             to build the actual coercions used to transform numbers for each format string. However,
281             the ParseExcelFormatStrings transformation should work for all region specific strings.
282             When changing the number formats (output) for this class you could just set a different
283             L<hash ref|/defined_excel_translations> when calling a new or update the values with the
284             method L<set_defined_excel_formats|/set_defined_excel_formats( %args )>. This package also
285             uses L<Encode> to provide for encoding changes for strings. In general the package
286             L<XML::LibXML> pulls the defined encoding for the Excel file from the underlying XML encoding
287             and auto parses it to perl coding for storage. This package does provide a way to export the
288             data out to your L<target_encoding|/target_encoding>.
289            
290             =head2 Primary Methods
291              
292             These are the primary ways to use this class. For additional FmtDefault options see the
293             L<Attributes|/Attributes> section.
294              
295             =head3 get_defined_excel_format( $position )
296              
297             =over
298              
299             B<Definition:> This will return the preset excel format string for the stored position.
300             The positions are actually stored in a hash where the keys are integers representing a
301             position in an order list.
302              
303             B<Accepts:> an integer or an octal number or octal string for the for the format string
304             $position
305              
306             B<Returns:> an excel format string
307              
308             B<Delegated to the workbook class:> yes
309              
310             =back
311              
312             =head3 set_defined_excel_formats( %args )
313              
314             =over
315              
316             B<Definition:> This will set the excel format strings for the stored positions.
317             The positions are actually stored in a hash where the keys are integers representing a
318             position in an order list.
319              
320             B<Accepts:> a Hash list, a hash ref (both with keys representing positions), or an array
321             of strings with the update strings in the equivalent position. All empty positions are
322             ignored meaning that the defalt value is left in force. To erase the default value send
323             '@' (passthrough) as the format string for that position. This function does not do any
324             string validation. The validation is done when the coercion is generated.
325              
326             B<Returns:> 1 for success
327              
328             =back
329              
330             =head3 total_defined_excel_formats
331              
332             =over
333              
334             B<Definition:> This returns the current count of excel formats that are defined
335              
336             B<Accepts:> nothing
337              
338             B<Returns:> $count (an integer)
339              
340             B<Delegated to the workbook class:> yes
341              
342             =back
343              
344             =head3 change_output_encoding( $string )
345              
346             =over
347              
348             B<Definition:> This is always called by the L<Worksheet
349             |Spreadsheet::XLSX::Reader::LibXML::Worksheet> when a cell value is retreived in order to allow
350             for encoding adjustments on the way out. See
351             L<XML::LibXML/ENCODINGS SUPPORT IN XML::LIBXML> for an explanation of how the input encoding
352             is handled. This conversion out is done prior to any number formatting. If you are replacing
353             this role you need to have the function and you can use it to mangle your output string any
354             way you want.
355              
356             B<Accepts:> a perl coded string
357              
358             B<Returns:> the converted $string decoded to the L<defined format|/target_encoding>
359              
360             B<Delegated to the workbook class:> yes
361              
362             =back
363              
364             =head3 get_defined_conversion( $position )
365              
366             Defined in L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/get_defined_conversion( $position )>
367              
368             =head3 parse_excel_format_string( $format_string, $name )
369              
370             Defined in L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/parse_excel_format_string( $string, $name )>
371              
372             B<Delegated to the workbook class:> no
373              
374             =head2 Attributes
375              
376             Data passed to new when creating an instance of this class. For modification of these attributes
377             see the listed 'attribute methods'. For more information on attributes see
378             L<Moose::Manual::Attributes>. The easiest way to modify these attributes are when a class
379             instance is created and before it is passed to the workbook or parser.
380              
381             =head3 error_inst
382              
383             =over
384              
385             B<Definition:> This is mostly a place to store the shared error reporting instance from
386             the workbook. It is not necessary to define this attribute since it will be overwritten
387             by the workbook when the Spreadsheet::XLSX::Reader::LibXML instance is loaded to the
388             parser / workbook.
389              
390             B<Required Methods:> (of the instance) error, set_error, clear_error
391              
392             B<Default:> none
393              
394             B<Attribute required:> no
395              
396             B<attribute methods> Methods provided to adjust this attribute
397            
398             =over
399              
400             B<set_error_inst>
401              
402             =over
403              
404             B<Definition:> use to set a new error instance.
405              
406             =back
407              
408             =back
409              
410             =back
411              
412             =head3 excel_region
413              
414             =over
415              
416             B<Definition:> This records the target region of this localization role (Not the region of the
417             Excel workbook being parsed). It's mostly a reference value.
418              
419             B<Default:> en = english
420              
421             B<Attribute required:> no
422              
423             B<attribute methods> Methods provided to adjust this attribute
424            
425             =over
426              
427             B<get_excel_region>
428              
429             =over
430              
431             B<Definition:> returns the value of the attribute (en)
432              
433             =back
434              
435             B<set_excel_region>
436              
437             =over
438              
439             B<Definition:> sets the value of the attribute.
440              
441             =back
442              
443             =back
444              
445             =back
446              
447             =head3 target_encoding
448              
449             =over
450              
451             B<Definition:> This is the target output encoding. If it is not defined the string
452             transformation step becomes a passthrough. When the value is loaded it is used as a
453             'decode' target by L<Encode> to transform the internally stored perl string to some
454             target 'output' formatting. The testing for the results of entering actual values
455             here is weak.
456              
457             B<Attribute required:> no
458              
459             B<Default:> none
460              
461             B<Range:> Any encoding recognized by L<Encode>
462              
463             B<attribute methods> Methods provided to adjust this attribute
464            
465             =over
466              
467             B<set_target_encoding( $encoding )>
468              
469             =over
470              
471             B<Definition:> This should be recognized by L<Encode/Listing available encodings>
472              
473             =back
474              
475             B<get_target_encoding>
476              
477             =over
478              
479             B<Definition:> Returns the currently set attribute value
480              
481             =back
482              
483             =back
484              
485             =back
486              
487             =head3 defined_excel_translations
488              
489             =over
490              
491             B<Definition:> In Excel part of localization is the way numbers are displayed.
492             Excel manages that with a default list of format strings that make the numbers appear
493             in a familiar way. This is where you store / change that list for this package.
494             In this case the numbers are stored as hash key => value pairs where the keys are
495             integers representing the format string position and the values are the Excel
496             readable format strings (definitions). Beware that if you change the list your
497             reader may break if you don't supply replacements for all the values in the default
498             list. If you just want to replace some of the values use the method
499             L<set_defined_excel_formats|/set_defined_excel_formats( %args )>.
500              
501             B<Attribute required:> yes
502              
503             B<Default:> see the code
504              
505             B<Range:> Any hashref of formats recognized by
506             L<Spreadsheet::XLSX::Reader::::LibXML::ParseExcelFormatStrings>
507              
508             B<attribute methods> Methods provided to by the attribute to adjust it.
509            
510             =over
511              
512             B<total_defined_excel_formats>
513              
514             =over
515              
516             B<Definition:> get the count of the current key => value pairs
517              
518             =back
519              
520             See L<get_defined_excel_format|/get_defined_excel_format( $position )> and
521             L<set_defined_excel_formats|/set_defined_excel_formats( %args )>
522              
523             =back
524              
525             =back
526              
527             =head3 dont_inherit
528              
529             =over
530              
531             B<Definition:> If for some reason you wish to set the formatter instance with
532             settings that do not inherit from the workbook then this attribute if for you.
533             The package to formtter inheritances are identified in the L<PACKAGE DESCRIPTION
534             |/PACKAGE DESCRIPTION>
535              
536             B<Attribute required:> no
537              
538             B<Default:> 0 = inherit from the package
539              
540             B<Range:> 1|0
541              
542             B<attribute methods> Methods provided to by the attribute to adjust it.
543            
544             =over
545              
546             B<block_inherit>
547              
548             =over
549              
550             B<Definition:> This is the reader for the attribute value
551              
552             =back
553              
554             =back
555              
556             =back
557              
558             =head3 epoch_year
559              
560             =over
561              
562             Defined at L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/epoch_year>
563              
564             =back
565              
566             =head3 cache_formats
567              
568             =over
569              
570             Defined at L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/cache_formats>
571              
572             =back
573              
574             =head3 datetime_dates
575              
576             =over
577              
578             Defined at L<Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/datetime_dates>
579              
580             =back
581              
582             =head2 Replacement
583              
584             Any replacement of this class must provide the following methods in order to interact
585             correctly with the workbook
586              
587             =over
588              
589             L<set_error_inst|/error_inst>
590              
591             L<set_excel_region|/excel_region>
592              
593             L<set_target_encoding|/target_encoding>
594              
595             L<get_defined_excel_format|/get_defined_excel_format( $position )>
596              
597             L<set_defined_excel_formats|/set_defined_excel_formats( %args )>
598              
599             L<change_output_encoding|/change_output_encoding( $string )>
600              
601             L<block_inherit|/dont_inherit>
602              
603             L<set_epoch_year|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/epoch_year>
604              
605             L<set_cache_behavior|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/cache_formats>
606              
607             L<set_date_behavior|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/datetime_dates>
608              
609             L<get_date_behavior|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/datetime_dates>
610              
611             L<get_defined_conversion|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/get_defined_conversion( $position )>
612              
613             L<parse_excel_format_string|Spreadsheet::XLSX::Reader::LibXML::ParseExcelFormatStrings/parse_excel_format_string( $string, $name )>
614              
615             =back
616              
617             =head1 SUPPORT
618              
619             =over
620              
621             L<github Spreadsheet::XLSX::Reader::LibXML/issues
622             |https://github.com/jandrew/Spreadsheet-XLSX-Reader-LibXML/issues>
623              
624             =back
625              
626             =head1 TODO
627              
628             =over
629              
630             Nothing L<yet|/SUPPORT>.
631              
632             =back
633              
634             =head1 AUTHOR
635              
636             =over
637              
638             Jed Lund
639              
640             jandrew@cpan.org
641              
642             =back
643              
644             =head1 COPYRIGHT
645              
646             This program is free software; you can redistribute
647             it and/or modify it under the same terms as Perl itself.
648              
649             The full text of the license can be found in the
650             LICENSE file included with this module.
651              
652             This software is copyrighted (c) 2014, 2015 by Jed Lund
653              
654             =head1 DEPENDENCIES
655              
656             =over
657              
658             L<version> - 0.77
659              
660             L<perl 5.010|perl/5.10.0>
661              
662             L<Moose>
663              
664             L<Types::Standard>
665              
666             L<Carp> - confess
667              
668             L<Encode> - decode
669              
670             =back
671              
672             =head1 SEE ALSO
673              
674             =over
675              
676             L<Spreadsheet::ParseExcel> - Excel 2003 and earlier
677              
678             L<Spreadsheet::XLSX> - 2007+
679              
680             L<Spreadsheet::ParseXLSX> - 2007+
681              
682             L<Log::Shiras|https://github.com/jandrew/Log-Shiras>
683              
684             =over
685              
686             All lines in this package that use Log::Shiras are commented out
687              
688             =back
689              
690             =back
691              
692             =cut
693              
694             #########1#########2 main pod documentation end 5#########6#########7#########8#########9