File Coverage

blib/lib/Data/XLSX/Parser.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package Data::XLSX::Parser;
2 6     6   164425 use strict;
  6         15  
  6         313  
3 6     6   36 use warnings;
  6         11  
  6         332  
4              
5             our $VERSION = '0.13';
6              
7 6     6   2949 use Data::XLSX::Parser::DocumentArchive;
  6         22  
  6         274  
8 6     6   6198 use Data::XLSX::Parser::Workbook;
  0            
  0            
9             use Data::XLSX::Parser::SharedStrings;
10             use Data::XLSX::Parser::Styles;
11             use Data::XLSX::Parser::Sheet;
12             use Data::XLSX::Parser::Relationships;
13              
14             sub new {
15             my ($class) = @_;
16              
17             bless {
18             _row_event_handler => [],
19             _archive => undef,
20             _workbook => undef,
21             _shared_strings => undef,
22             _relationships => undef,
23             }, $class;
24             }
25              
26             sub add_row_event_handler {
27             my ($self, $handler) = @_;
28             push @{ $self->{_row_event_handler} }, $handler;
29             }
30              
31             sub open {
32             my ($self, $file) = @_;
33             $self->{_archive} = Data::XLSX::Parser::DocumentArchive->new($file);
34             }
35              
36             sub workbook {
37             my ($self) = @_;
38             $self->{_workbook} ||= Data::XLSX::Parser::Workbook->new($self->{_archive});
39             }
40              
41             sub shared_strings {
42             my ($self) = @_;
43             $self->{_shared_strings} ||= Data::XLSX::Parser::SharedStrings->new($self->{_archive});
44             }
45              
46             sub styles {
47             my ($self) = @_;
48             $self->{_styles} ||= Data::XLSX::Parser::Styles->new($self->{_archive});
49             }
50              
51             sub relationships {
52             my ($self) = @_;
53             $self->{_relationships} ||= Data::XLSX::Parser::Relationships->new($self->{_archive});
54             }
55              
56             sub sheet {
57             my ($self, $sheet_id) = @_;
58             $self->{_sheet}->{$sheet_id} ||= Data::XLSX::Parser::Sheet->new($self, $self->{_archive}, $sheet_id);
59             }
60              
61             sub sheet_by_rid {
62             my ($self, $rid) = @_;
63              
64             my $target = $self->relationships->relation_target($rid);
65             unless ($target) {
66             return;
67             }
68              
69             if ($target =~ /worksheets\/sheet(\d+).xml/) {
70             return $self->sheet($1);
71             }
72             }
73              
74             sub _row_event {
75             my ($self, $row) = @_;
76              
77             my $row_vals = [map { $_->{v} } @$row];
78             for my $handler (@{ $self->{_row_event_handler} }) {
79             $handler->($row_vals);
80             }
81             }
82              
83             1;
84              
85             __END__