Spreadsheet-Read-0.63/0000755000031300001440000000000012606163731015264 5ustar00merijnusers00000000000000Spreadsheet-Read-0.63/examples/0000755000031300001440000000000012606163731017102 5ustar00merijnusers00000000000000Spreadsheet-Read-0.63/examples/xls2csv0000755000031300001440000000156112451241472020434 0ustar00merijnusers00000000000000#!/pro/bin/perl # xls2csv: Convert Microsoft Excel spreadsheet to CSV # (m)'13 [24-10-2013] Copyright H.M.Brand 2008-2015 use strict; use warnings; sub usage { my $err = shift and select STDERR; print "usage: $0 [ -o file.csv ] file.xls\n"; @_ and print join "\n", @_, ""; exit $err; } # usage use Getopt::Long qw( :config bundling nopermute passthrough ); my $csv; my $opt_f; GetOptions ( "help|?" => sub { usage 0; }, "o|c=s" => \$csv, "f" => \$opt_f, ) or usage 1; my $xls = shift or usage 1, "No input file"; -r $xls or usage 1, "Input file unreadable"; -s $xls or usage 1, "Input file empty"; $csv or ($csv = $xls) =~ s/\.xls$/.csv/i; if (-f $csv) { $opt_f or die "$csv already exists\n"; unlink $csv; } print STDERR "Converting $xls to $csv ...\n"; open STDOUT, ">", $csv; exec "xlscat", "-c", $xls; Spreadsheet-Read-0.63/examples/ss-dups-tk.pl0000755000031300001440000001667612451241473021472 0ustar00merijnusers00000000000000#!/pro/bin/perl # ss-dup-tk.pl: Find dups in spreadsheet # (m)'09 [23-01-2009] Copyright H.M.Brand 2005-2015 use strict; use warnings; sub usage { my $err = shift and select STDERR; print "usage: $0 [-t] [-S ] [-R ] [-C columns] [-F ]\n", "\t-t Only check on true values\n", "\t-S sheets Check sheet(s). Defaul = 1, 1,3-5,all\n", "\t-R rows Check row(s). Defaul = all, 6,19-66\n", "\t-C columns Check column(s). Defaul = all, 2,5-9\n", "\t-F fields Check field(s). Defaul = all, A1,A2,B15,C23\n"; exit $err; } # usage use Spreadsheet::Read; use Getopt::Long qw(:config bundling nopermute noignorecase); my $opt_v = 0; my $opt_t = 0; # Only check on true values my @opt_S; # Sheets to print my @opt_R; # Rows to print my @opt_C; # Columns to print my @opt_F; GetOptions ( "help|?" => sub { usage (0); }, "S|sheets=s" => \@opt_S, "R|rows=s" => \@opt_R, "C|columns=s" => \@opt_C, "F|fields=s" => \@opt_F, "t|true" => \$opt_t, "v|verbose:1" => \$opt_v, ) or usage (1); @opt_S or @opt_S = (1); use Tk; use Tk::ROText; my $file = shift || (sort { -M $b <=> -M $a } glob "*.xls")[0]; my ($mw, $is, $ss, $dt) = (MainWindow->new, "1.0"); sub ReadFile { $file or return; $dt->delete ("1.0", "end"); unless ($ss = ReadData ($file)) { $dt->insert ("end", "Cannot read $file as spreadsheet\n"); return; } my @ss = map { qq{"$ss->[$_]{label}"} } 1 .. $ss->[0]{sheets}; my @finfo = ( "File: $file", ( map { "Sheet $_: '$ss->[$_]{label}'\t($ss->[$_]{maxcol} x $ss->[$_]{maxrow})" } 1 .. $ss->[0]{sheets} ), "=============================================================="); $dt->insert ("end", join "\n", @finfo, ""); $is = (@finfo + 1).".0"; return $ss; } # ReadFile my $tf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $tf->Entry ( -textvariable => \$file, -width => 40, -vcmd => \&ReadFile, )->pack (qw(-side left -expand 1 -fill both)); my %ftyp; for ([ xls => [ "Excel Files", [qw( .xls .XLS )] ] ], [ xlsx => [ "Excel Files", [qw( .xlsx .XLSX )] ] ], [ sxc => [ "OpenOffice Files", [qw( .sxc .SXC )] ] ], [ ods => [ "OpenOffice Files", [qw( .ods .ODS )] ] ], [ csv => [ "CSV Files", [qw( .csv .CSV )] ] ], ) { my ($ft, $r) = @$_; Spreadsheet::Read::parses ($ft) or next; push @{$ftyp{$r->[0]}}, @{$r->[1]}; push @{$ftyp{"All spreadsheet types"}}, @{$r->[1]}; } $tf->Button ( -text => "Select file", -command => sub { $ss = undef; $file = $mw->getOpenFile ( -filetypes => [ ( map { [ $_, $ftyp{$_} ] } sort keys %ftyp ), [ "All files", "*" ], ], ); ReadFile (); }, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Detect", -command => \&Detect, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Show", -command => \&Show, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Exit", -command => \&exit, )->pack (qw(-side left -expand 1 -fill both)); my $mf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); my $sw = $mf->Scrolled ("ROText", -scrollbars => "osoe", -height => 40, -width => 85, -foreground => "Black", -background => "White", -highlightthickness => 0, -setgrid => 1)->pack (qw(-expand 1 -fill both)); $dt = $sw->Subwidget ("scrolled"); #$sw->Subwidget ("xscrollbar")->packForget; $dt->configure ( -wrap => "none", -font => "mono 12", ); my $bf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $bf->Checkbutton ( -variable => \$opt_t, -text => "True values only", )->pack (qw(-side left -expand 1 -fill both)); { my $opt_S = @opt_S ? join ",", @opt_S : 1; $bf->Label ( -text => "Sheet(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_S, -width => 10, -validate => "focusout", -vcmd => sub { @opt_S = grep m/\S/, split m/\s*,\s*/ => $opt_S; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_R = join ",", @opt_R; $bf->Label ( -text => "Rows(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_R, -width => 10, -validate => "focusout", -vcmd => sub { @opt_R = grep m/\S/, split m/\s*,\s*/ => $opt_R; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_C = join ",", @opt_C; $bf->Label ( -text => "Columns(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_C, -width => 10, -validate => "focusout", -vcmd => sub { @opt_C = grep m/\S/, split m/\s*,\s*/ => $opt_C; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } sub ranges (@) { my @g; foreach my $arg (@_) { for (split m/,/, $arg) { if (m/^(\w+)\.\.(\w+)$/) { my ($s, $e) = ($1, $2); $s =~ m/^[1-9]\d*$/ or ($s, $e) = (qq("$s"), qq("$e")); eval "push \@g, $s .. $e"; } else { push @g, $_; } } } $opt_v and print STDERR "( @g )\n"; @g; } # ranges sub Detect { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C", "--------------------------------------------------------------", ""); my %done; my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); foreach my $r (@r) { foreach my $c (@c) { defined $xls->{cell}[$c][$r] or next; my $v = uc $xls->{cell}[$c][$r]; my $cell = cr2cell ($c, $r); @S > 1 and $cell = $xls->{label} . "[$cell]"; $opt_t && !$v and next; @opt_F && !exists $f{$cell} and next; if (exists $done{$v}) { $dt->insert ("end", sprintf "Cell %-5s is dup of %-5s '%s'\n", $cell, $done{$v}, $v); next; } $done{$v} = $cell; } } } } # Detect sub Show { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C"); my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; $dt->insert ("end", "\n--------------------------------------------------------------". "\nSheet $s: '$xls->{label}'\t($xls->{maxcol} x $xls->{maxrow})\n"); my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); $dt->insert ("end", " |"); for (@c) { (my $ch = cr2cell ($_, 1)) =~ s/1$//; $dt->insert ("end", sprintf "%11s |", $ch); } $dt->insert ("end", "\n-----+"); $dt->insert ("end", "------------+") for @c; foreach my $r (@r) { $dt->insert ("end", sprintf "\n%4d |", $r); foreach my $c (@c) { my $cell = cr2cell ($c, $r); my $v = defined $xls->{cell}[$c][$r] ? $xls->{$cell} : "--"; length ($v) < 12 and substr $v, 0, 0, " " x (12 - length $v); $dt->insert ("end", substr ($v, 0, 12). "|"); } } } } # Show MainLoop; Spreadsheet-Read-0.63/examples/xlscat0000755000031300001440000003471712566615734020354 0ustar00merijnusers00000000000000#!/pro/bin/perl # xlscat: show XLS/SXC file as Text # xlsgrep: grep pattern # (m)'15 [24-08-2015] Copyright H.M.Brand 2005-2015 use strict; use warnings; our $VERSION = "3.2"; my $is_grep = $0 =~ m/grep$/; sub usage { my $err = shift and select STDERR; (my $scrpt = $0) =~ s{.*[\/]}{}; my $p = $is_grep ? " pattern" : ""; print "usage: $scrpt\t[-s ] [-L] [-n] [-A] [-u] [Selection]$p file.xls\n", " \t[-c | -m] [-u] [Selection]$p file.xls\n", " \t -i [-S sheets]$p file.xls\n", " Generic options:\n", " -v[#] Set verbose level (xlscat/xlsgrep)\n", " -d[#] Set debug level (Spreadsheet::Read)\n", " -u Use unformatted values\n", " --noclip Do not strip empty sheets and\n", " trailing empty rows and columns\n", " -e Set encoding for input and output\n", " -b Set encoding for input\n", " -a Set encoding for output\n", " Input CSV:\n", " --in-sep=c Set input sep_char for CSV\n", " Input XLS:\n", " --dtfmt=fmt Specify the default date format to replace 'm-d-yy'\n", " the default replacement is 'yyyy-mm-dd'\n", " Output Text (default):\n", " -s Use separator . Default '|', \\n allowed\n", " -L Line up the columns\n", " -n [skip] Number lines (prefix with column number)\n", " optionally skip (header) lines\n", " -A Show field attributes in ANSI escapes\n", " -h[#] Show # header lines\n", $is_grep ? ( " Grep options:\n", " -i Ignore case\n", " -w Match whole words only\n") : ( " Output Index only:\n", " -i Show sheet names and size only\n"), " Output CSV:\n", " -c Output CSV, separator = ','\n", " -m Output CSV, separator = ';'\n", " Output HTML:\n", " -H Output HTML\n", " Selection:\n", " -S Only print sheets . 'all' is a valid set\n", " Default only prints the first sheet\n", " -R Only print rows . Default is 'all'\n", " -C Only print columns . Default is 'all'\n", " -F Only fields e.g. -FA3,B16\n", " Ordering (column numbers in result set *after* selection):\n", " --sort=spec Sort output (e.g. --sort=3,2r,5n,1rn+2)\n", " +# - first # lines do not sort (header)\n", " # - order on column # lexical ascending\n", " #n - order on column # numeric ascending\n", " #r - order on column # lexical descending\n", " #rn - order on column # numeric descending\n"; @_ and print join "\n", @_, ""; exit $err; } # usage use Getopt::Long qw(:config bundling noignorecase); my $opt_c; # Generate CSV my $opt_s; # Text separator my $opt_S; # Sheets to print my $opt_R; # Rows to print my $opt_C; # Columns to print my $dtfmt; # Default date-format for Excel my $opt_F = ""; # Fields to print my $opt_i = 0; # Index (cat) | ignore_case (grep) my $opt_L = 0; # Auto-size/align columns my $opt_n; # Prefix lines with column number my $opt_u = 0; # Show unformatted values my $opt_v = 0; # Verbosity for xlscat my $opt_d = 0; # Debug level for Spreadsheet::Read my $opt_A = 0; # Show field colors in ANSI escapes my $opt_H = 0; # Output in HTML my $opt_h = 0; # Number of header lines for grep or -L my $opt_w = 0; # Grep words my $clip = 1; my $enc_i; # Input encoding my $enc_o; # Output encoding my $sep; # Input field sep for CSV GetOptions ( "help|?" => sub { usage (0); }, # Input CSV "c|csv" => sub { $opt_c = "," }, "m|ms" => sub { $opt_c = ";" }, "insepchar". "|in-sep". "|in-sep-char=s" => \$sep, # Input XLS "dtfmt". "|date-format=s" => \$dtfmt, # Output "i|index". "|ignore-case" => \$opt_i, "s|separator". "|outsepchar". "|out-sep". "|out-sep-char=s" => \$opt_s, "S|sheets=s" => \$opt_S, "R|rows=s" => \$opt_R, "C|columns=s" => \$opt_C, "F|fields=s" => \$opt_F, "L|fit|align!" => \$opt_L, "n|number:0" => \$opt_n, "A|ansi|color!" => \$opt_A, "u|unformatted!" => \$opt_u, "v|verbose:1" => \$opt_v, "d|debug:1" => \$opt_d, "H|html:1" => \$opt_H, "noclip" => sub { $clip = 0 }, "sort=s" => \my $sort_order, # Encoding "e|encoding=s" => sub { $enc_i = $enc_o = $_[1] }, "b|encoding-in=s" => \$enc_i, "a|encoding-out=s" => \$enc_o, # Grep "w|word!" => \$opt_w, "h|header:1" => \$opt_h, ) or usage 1, "GetOpt: $@"; unless ($is_grep) { $opt_i && $opt_L and usage 1, "Options i and L are mutually exclusive"; $opt_i && $opt_s and usage 1, "Options i and s are mutually exclusive"; $opt_i && $opt_c and usage 1, "Options i and c are mutually exclusive"; $opt_i && $opt_u and usage 1, "Options i and u are mutually exclusive"; $opt_i && $opt_S and usage 1, "Options i and S are mutually exclusive"; $opt_i && $opt_R and usage 1, "Options i and R are mutually exclusive"; $opt_i && $opt_C and usage 1, "Options i and C are mutually exclusive"; $opt_i && $opt_F and usage 1, "Options i and F are mutually exclusive"; $opt_i && $opt_H and usage 1, "Options i and H are mutually exclusive"; } $opt_c && $opt_s and usage 1, "Options c and s are mutually exclusive"; $opt_c && $opt_H and usage 1, "Options c and H are mutually exclusive"; $opt_s && $opt_H and usage 1, "Options s and H are mutually exclusive"; defined $opt_s or $opt_s = "|"; eval "\$opt_s = qq{$opt_s}"; defined $opt_S or $opt_S = $opt_i || $is_grep ? "all" : "1"; $opt_i && !$is_grep && $opt_v < 1 and $opt_v = 1; if ($opt_c) { $opt_L = 0; # Cannot align CSV $opt_c =~ m/^1?$/ and $opt_c = ","; $opt_c = Text::CSV_XS->new ({ binary => 1, sep_char => $opt_c, eol => "\r\n", }); } # Debugging. Prefer Data::Peek over Data::Dumper if available { use Data::Dumper; my $dp = 0; eval q{ use Data::Peek; $dp = 1; }; sub ddumper { $dp ? DDumper (@_) : print STDERR Dumper (@_); } # ddumper } my $pattern; if ($is_grep) { $pattern = shift or usage 1; $opt_w and $pattern = "\\b$pattern\\b"; $opt_i and $pattern = "(?i:$pattern)"; $pattern = qr{$pattern}; $opt_v > 1 and warn "Matching on $pattern\n"; } @ARGV or usage 1; my $file = shift; -f $file or usage 1, "the file argument is not a regular file"; -s $file or usage 1, "the file is empty"; use Encode qw( encode decode ); use Spreadsheet::Read; if ($opt_c) { Spreadsheet::Read::parses ("csv") or die "No CSV module found\n"; eval q{use Text::CSV_XS}; } if ($opt_H) { $enc_o = "utf-8"; $opt_H = sub { $_[0]; }; eval q{ use HTML::Entities; $opt_H = sub { encode_entities (Encode::is_utf8 ($_[0]) ? $_[0] : decode ("utf-8", $_[0])); }; }; } my @RDarg = (debug => $opt_d, clip => $clip); $opt_A and push @RDarg, "attr" => 1; defined $sep and push @RDarg, "sep" => $sep, parser => "csv"; defined $dtfmt and push @RDarg, "dtfmt" => $dtfmt; $opt_v > 4 and warn "ReadData ($file, @RDarg);\n"; my $xls = ReadData ($file, @RDarg) or die "cannot read $file\n"; $opt_v > 7 and ddumper ($xls); my $sc = $xls->[0]{sheets} or die "No sheets in $file\n"; $opt_v > 1 and warn "Opened $file with $sc sheets\n"; $opt_S eq "all" and $opt_S = "1..$sc"; # all $opt_S =~ s/-$/-$sc/; # 3,6- $opt_S =~ s/-/../g; my %print; eval "%{\$print{sheet}} = map { \$_ => 1 } $opt_S"; my $v_fmt = $opt_C || $opt_R || $opt_F ? "" : "%6d x %6d%s"; # New style xterm (based on ANSI colors): # 30 Black # 31 Red # 32 Green # 33 Yellow # 34 Blue # 35 Magenta # 36 Cyan # 37 White sub color_reduce { my ($rgb, $base) = @_; defined $rgb or return ""; my ($r, $g, $b) = map { hex >> 7 } ($rgb =~ m/^\s*#?([\da-f]{2})([\da-f]{2})([\da-f]{2})/); $base + 4 * $b + 2 * $g + $r; } # color_reduce sub ansi_color { my ($fg, $bg, $bold, $ul) = @_; # warn "$fg on $bg $bold $ul\n"; my $attr = join ";", 0, grep { /\S/ } $bold ? 1 : "", $ul ? 4 : "", color_reduce ($fg, 30), color_reduce ($bg, 40); "\e[${attr}m"; } # ansi_color sub css_color { my ($fg, $bg, $bold, $ul, $ha) = @_; my @css; $bold and push @css, "font-weight: bold"; $ul and push @css, "text-decoration: underline"; $fg and push @css, "color: $fg"; $bg and push @css, "background: $bg"; $ha and push @css, "text-align: $ha"; local $" = "; "; @css ? qq{ style="@css"} : ""; } # css_color binmode STDERR, ":utf8"; $enc_o and binmode STDOUT, ":encoding($enc_o)"; if ($opt_H) { print < $file EOH } my $name_len = 30; if ($opt_i) { my $nl = 0; foreach my $sn (keys %{$xls->[0]{sheet}}) { length ($sn) > $nl and $nl = length $sn; } $nl and $name_len = $nl; } my @opt_F = split m/[^A-Z\d]+/ => $opt_F; foreach my $si (1 .. $sc) { my @data; exists $print{sheet}{$si} or next; $opt_v > 1 and warn "Opening sheet $si ...\n"; my $s = $xls->[$si] or next; $opt_v > 5 and ddumper ($s); my @r = (1, $s->{maxrow}); my @c = (1, $s->{maxcol}); my ($sn, $nr, $nc) = ($s->{label}, $r[-1], $c[-1]); $opt_v and printf STDERR "%s - %02d: [ %-*s ] %3d Cols, %5d Rows\n", $file, $si, $name_len, $sn, $nc, $nr; $opt_i && !$is_grep and next; if (@opt_F) { foreach my $fld (@opt_F) { $is_grep && defined $s->{$fld} && $s->{$fld} !~ $pattern and next; print "$fld:",$s->{$fld},"\n"; } next; } if (my $rows = $opt_R) { $rows eq "all" and $rows = "1..$nr"; # all $rows =~ s/-$/-$nr/; # 3,6- $rows =~ s/-/../g; eval "%{\$print{row}} = map { \$_ => 1 } $rows"; } if (my $cols = $opt_C) { $cols eq "all" and $cols = "1..$nc"; # all if ($cols =~ m/[A-Za-z]/) { # -C B,D => -C 2,4 my %ct = map { my ($cc, $rr) = cell2cr (uc "$_".1); ($_ => $cc) } ($cols =~ m/([a-zA-Z]+)/g); $cols =~ s/([A-Za-z]+)/$ct{$1}/g; } $cols =~ s/-$/-$nc/; # 3,6- $cols =~ s/-/../g; eval "\$print{col} = [ map { \$_ - 1 } $cols ]"; $nc = @{$print{col}}; } $opt_v >= 8 and ddumper (\%print); $opt_H and print qq{

$sn

\n\n\n}; my $undef = $opt_v > 2 ? "-- undef --" : ""; my ($h, @w) = (0, (0) x $nc); # data height, -width, and default column widths my @align = ("") x $nc; foreach my $r ($r[0] .. $r[1]) { exists $print{row} && !exists $print{row}{$r} and next; my @att; my @row = map { my $cell = cr2cell ($_, $r); my ($uval, $fval) = map { defined $_ ? $enc_i ? decode ($enc_i, $_) : $_ : $undef } $s->{cell}[$_][$r], $s->{$cell}; $opt_v > 2 and warn "$_:$r '$uval' / '$fval'\n"; $opt_A and push @att, [ @{$s->{attr}[$_][$r]}{qw( fgcolor bgcolor bold uline halign )} ]; defined $s->{cell}[$_][$r] ? $opt_u ? $uval : $fval : ""; } $c[0] .. $c[1]; exists $print{col} and @row = @row[grep{$_<@row}@{$print{col}}]; $is_grep && $r > $opt_h && ! grep { defined $_ && $_ =~ $pattern } @row and next; if ($opt_L) { foreach my $c (0 .. $#row) { my $l = length $row[$c]; $l > $w[$c] and $w[$c] = $l; $row[$c] =~ m/\D/ and $align[$c] = "-"; } } if ($opt_H) { # HTML print " "; if (defined $opt_n) { my $x = $r - $opt_n; $x <= 0 and $x = ""; my $c = $r % 2 ? qq{ class="odd"} : ""; print qq{}; } foreach my $c (0 .. $#row) { my $css = css_color (@{$att[$c]}); $r % 2 and $css .= qq{ class="odd"}; my $td = $opt_H->($row[$c]); print "$td"; } print "\n"; next; } if ($opt_c) { # CSV $opt_c->print (*STDOUT, \@row) or die $opt_c->error_diag; next; } if (defined $opt_n) { unshift @row, $r; unshift @att, [ "#ffffff", "#000000", 0, 0 ]; } if ($opt_L || $sort_order) { # Autofit / Align / order push @data, [ [ @row ], [ @att ] ]; next; } if ($opt_A) { foreach my $c (0 .. $#row) { $row[$c] = ansi_color (@{$att[$c]}). $row[$c] . "\e[0m"; } } line ($opt_s => @row); } continue { ++$h % 100 == 0 && $opt_v and printf STDERR $v_fmt, $nc, $h, "\r"; } $opt_H and print "
$x
\n\n"; $v_fmt and printf STDERR $v_fmt, $nc, $h, "\n"; if ($sort_order) { my @o; my @h; $sort_order =~ s/\+([0-9]+)\b// and @h = splice @data, 0, $1; for ($sort_order =~ m/([0-9]+[rn]*)/g) { m/^([0-9]+)(.*)/; push @o, { col => $1 - 1, map { $_ => 1 } split m// => $2 }; } my $sort = sub { my $d = 0; foreach my $o (@o) { my ($A, $B) = map { $_->[0][$o->{col}] || 0 } $a, $b; $d = $o->{n} ? $o->{r} ? $B <=> $A : $A <=> $B : $o->{r} ? $B cmp $A : $A cmp $B and return $d; } return $d; }; @data = (@h, sort $sort @data); } $opt_L || $sort_order or next; if (defined $opt_n) { unshift @w, length $data[-1][0][0]; unshift @align, ""; } $opt_n = 0; for (@data) { my ($row, $att) = @$_; my @row = @$row; for (0 .. $#row) { my $w = " " x ($w[$_] - length $row[$_]); if ($align[$_]) { $row[$_] .= $w; } else { substr $row[$_], 0, 0, $w; } if ($opt_A) { substr $row[$_], 0, 0, ansi_color (@{$att->[$_]}); $row[$_] .= "\e[0m"; } } line ("|" => @row); ++$opt_n == $opt_h and line ("+", map {"-"x$w[$_]} 0..$#row); } } $opt_H and print "\n\n"; sub line { my $sep = shift; my $line = join $sep => @_; !$enc_o && Encode::is_utf8 ($line) and $line = encode ("utf-8", $line); print "$line\n"; } # show_line Spreadsheet-Read-0.63/examples/ssdiff0000755000031300001440000000350512337045666020320 0ustar00merijnusers00000000000000#!/pro/bin/perl use strict; use warnings; sub usage { my $err = shift and select STDERR; print "usage: $0 [--verbose[=1]] file.xls file.xlsx\n"; exit $err; } # usage use Getopt::Long qw(:config bundling); my $opt_v = 1; GetOptions ( "help|?" => sub { usage (0); }, "v|verbose:2" => \$opt_v, ) or usage (1); my $file1 = shift or usage (1); my $file2 = shift or usage (1); binmode STDOUT, ":encoding(utf-8)"; use List::Util qw( max ); use Spreadsheet::Read; my $ss1 = ReadData ($file1) or die "Cannot read $file1: $!\n"; my $ss2 = ReadData ($file2) or die "Cannot read $file2: $!\n"; print "< $file1\t($ss1->[0]{sheets} sheets)\n"; print "> $file2\t($ss2->[0]{sheets} sheets)\n"; foreach my $s (1 .. max map { $_->[0]{sheets} } $ss1, $ss2) { my $s1 = $ss1->[$s]; my $s2 = $ss2->[$s]; unless ($s1) { print "$s: not in $file1\n"; last; } unless ($s2) { print "$s: not in $file2\n"; last; } printf "Sheet %d\n\t< %5d x %5d %s\n\t> %5d x %5d %s\n", $s, $s1->{maxcol}, $s1->{maxrow}, $s1->{label}, $s2->{maxcol}, $s2->{maxrow}, $s2->{label}; my $mc = max map { $_->{maxcol} } $s1, $s2; foreach my $r (1 .. max map { $_->{maxrow} } $s1, $s2) { if ($r > $s1->{maxrow}) { print "$s: EOS in $file1 at row $r\n"; last; } if ($r > $s2->{maxrow}) { print "$s: EOS in $file2 at row $r\n"; last; } my @r1 = Spreadsheet::Read::row ($s1, $r); my @r2 = Spreadsheet::Read::row ($s2, $r); foreach my $c (1 .. $mc) { my $c1 = $r1[$c]; my $c2 = $r2[$c]; if (defined $c1) { if (defined $c2) { $c1 eq $c2 and next; print "$s: ($r, $c)\n\t< $c1\n\t> $c2\n"; next; } print "$s: ($r, $c)\n\t< $c1\n\t> -- undefined --\n"; next; } defined $c2 or next; print "$s: ($r, $c)\n\t< -- undefined --\n\t> $c2\n"; } } } Spreadsheet-Read-0.63/examples/ss2tk0000755000031300001440000000773612451241500020100 0ustar00merijnusers00000000000000#!/pro/bin/perl # ss2tk: show SpreadSheet file in Tk::TableMatrix::Spreadsheet (*) # (m)'07 [26-06-2007] Copyright H.M.Brand 2005-2015 use strict; use warnings; our $VERSION = "2.1"; sub usage { my $err = shift and select STDERR; print "usage: ss2tk [-w ] [X11 options] file.xls []\n", " -w use as default column width (4)\n"; exit $err; } # usage use Getopt::Long qw(:config bundling nopermute passthrough); my $wdt = 4; # Default minimal column width my $unq = 0; # Uniq columns only GetOptions ( "help|?" => sub { usage (0); }, "w=i" => \$wdt, "u" => \$unq, ) or usage (1); use Tk; use Tk::NoteBook; use Tk::TableMatrix::Spreadsheet; # This will allow ~/.Xdefaults to have lines like #ss2tk*font: -misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1 Tk::CmdLine->LoadResources (); # This will allow calls like # ss2tk -fg Blue4 blah.csv Tk::CmdLine->SetArguments (); @ARGV && -f $ARGV[0] or usage (1); my $title = $ARGV[0]; my %unq; use Spreadsheet::Read; my $ref = ReadData (shift) or die "Cannot read $title\n"; $ref->[0]{sheets} or die "No sheets in $title\n"; my $mw = MainWindow->new (-title => $title); my $nb = $mw->NoteBook ()->pack (qw(-side top -expand 1 -fill both )); my @nb; foreach my $sht (1 .. $ref->[0]{sheets}) { my $s = $ref->[$sht]; $title .= " [ " . $s->{label} . " ]"; my $pat = @ARGV ? qr/$ARGV[0]/i : undef; my ($data, @data); my @c = (1, $s->{maxcol}); my ($h, $w, @w) = (0, 1, 0, (0) x $c[1]); # data height, -width, and default column widths foreach my $r (1 .. $s->{maxrow}) { my @row = map { defined $s->{cell}[$_][$r] ? $s->{cell}[$_][$r] : ""; } 1 .. $s->{maxcol}; $pat and "@row" =~ $pat || next; foreach my $c (0 .. $#row) { $row[$c] or next; $c >= $w and $w = $c + 1; $data->{"$h,$c"} = $row[$c]; push @data, "$h,$c"; my $l = length $row[$c]; $l > $w[$c] and $w[$c] = $l; } ++$h % 100 or printf STDERR "%6d x %6d\r", $w, $h; } printf STDERR "%6d x %6d\n", $w, $h; $nb[$sht] = $nb->add ($sht, -label => $s->{label}, -state => "normal", -anchor => "nw"); my $ss = $nb[$sht]->Scrolled ('Spreadsheet', -rows => $h, -cols => $w, -width => 10, -height => 20, -titlerows => 1, -titlecols => 0, -selectmode => "extended", -resizeborders => "both", -justify => "left", -anchor => "w", -variable => $data, )->pack (-expand => 1, -fill => "both", -side => "top", -anchor => "nw"); $ss->Subwidget ("${_}scrollbar")->configure (-width => 6) for qw( x y ); $ss->tagConfigure ("title", -bg => "#ffffe0", -justify => "left"); $ss->tagConfigure ("active", -bg => "#ffff40", -justify => "left"); $ss->tagConfigure ("sel", -bg => "gray95", -justify => "left"); my ($pv, $sv, $si) = ("", "", 0); sub search { $sv or return; $sv eq $pv && !$_[0] and return; $ss->selectionClear ("all"); foreach my $i ($_[0] .. $#data, 0 .. ($_[0] - 1)) { $data->{$data[$i]} =~ m/$sv/i or next; $si = $i; $ss->activate ($data[$si = $i]); $ss->selectionSet ($data[$si]); $ss->see ($data[$si]); $pv = $sv; last; } } # search # Search frame my $sf = $nb[$sht]->Frame ()->pack (-side => "left", -expand => 1, -fill => "both"); my $sl = $sf->Label ( -text => "Search", )->pack (-side => "left", -anchor => "sw"); my $sb = $sf->Entry ( -textvariable => \$sv, )->pack (-side => "left", -anchor => "sw"); $sb->bind ("" => sub { search ($si = 0); }); my $sn = $sf->Button ( -text => "Next", -command => sub { search (++$si) }, )->pack (-side => "left", -anchor => "sw"); # Control frame my $cf = $nb[$sht]->Frame ()->pack (-side => "right", -expand => 1, -fill => "both"); my $ce = $cf->Button ( -text => "Exit", -command => \&exit, )->pack (-side => "right", -anchor => "se"); # autosize columns on data (not on headers) $ss->colWidth (map { $_ => $w[$_] } 0 .. $#w); } MainLoop; Spreadsheet-Read-0.63/Changes0000644000031300001440000002746112606160310016557 0ustar00merijnusers000000000000000.63 - 10 Oct 2015, H.Merijn Brand * Guard against negative MinRow in XLSX * Documentation updated * Support Spreadsheet::XLSX::Reader::LibXML disabled on author request * Fix warning in utilities * Check minimum parser version for pre-selected parser 0.62 - 16 Aug 2015, H.Merijn Brand * Fix documentation structure * Test all supported parsers (not just the preferred one) * Basic support for Spreadsheet::XLSX::Reader::LibXML (work in progress) * Copy example file if link fails (Alan Berndt) * Add a contributing guide 0.61 - 13 Jun 2015, H.Merijn Brand * Discourage Spreadsheet::XLSX * A space is not an empty field in XLS * Strip the correct selection (RT#105197) 0.60 - 30 Mar 2015, H.Merijn Brand * No merged cell support in Spreadsheet::XLSX 0.59 - 26 Mar 2015, H.Merijn Brand * Minimal support (+ docs) for merged cells * Make parser errors report at one level up * Don't select non-existing columns in xlscat 0.58 - 11 Feb 2015, H.Merijn Brand * Remove perl recommendation from META as it breaks cpan clients * Move sort instruction to correct place in xlscat's help 0.57 - 08 Feb 2015, H.Merijn Brand * Moved project to github * Add --sort to xlscat * Clip before conversion * Removed an unneeded localizing of $/ (related to p5 RT#123218) 0.56 - 05 Jan 2015, H.Merijn Brand * printf does not play nice with encoding (related to RT#98436) * default output UTF-8 if whole line is UTF-8 0.55 - 01 Jan 2015, H.Merijn Brand * Mention Spreadsheet::CSV in documentation * Add ssdiff to examples * Amend xlscat -n to also number in HTML * Updated copyright to 2015 0.54 - 30 Jan 2014, H.Merijn Brand * Optional features required versions now builtin 0.53 - 29 Jan 2014, H.Merijn Brand * Updated copyright to 2014 * Prefer Data::Peek over Data::Dumper * Support (and prefer) Spreadsheet::ParseXLSX for .xlsx 0.52 - 05 Dec 2013, H.Merijn Brand * Store CSV parse error - if any - in $ss->[0]{error} 0.51 - 30 Oct 2013, H.Merijn Brand * Link xlsgrep during install 0.50 - 24 Oct 2013, H.Merijn Brand * Added xlsgrep to examples * Allow -C B,D for xlscat * More prominent reference to xlscat in docs 0.49 - 11 May 2013, H.Merijn Brand * /dev/null cannot be used for tests on Windows 0.48 - 14 Mar 2013, H.Merijn Brand * Improve documentation consistency (RT#80409) * Updated copyright to 2013 * Force old(er) tar format (ustar) - assumes GNU tar on release box * Fix yml/json optional_features * Install utilities from example by default * Several minor changes (for maint) 0.47 - 30 Jun 2012, H.Merijn Brand * Note that empty sheets are skipped when clip is true (RT#75277) * Allow undef as valid value for the options (Max Maischein) * Don't generate warnings when stripping whitespace and only generating one of cells or rc. (Max Maschein) * Fix test warning under perl-5.17.x 0.46 - 14 Feb 2012, H.Merijn Brand * Updated copyright to 2012 * Support passing attributes to the underlying parser * Do not strip fields in sheets with no cells at all (RT#74976) 0.45 - 07 Sep 2011, H.Merijn Brand * NAME / DISTNAME in Makefile.PL 0.44 - 07 Sep 2011, H.Merijn Brand * More cross-checks for META data 0.43 - 02 Aug 2011, H.Merijn Brand * Changed name in META.yml (RT#69574) 0.42 - 01 Jun 2011, H.Merijn Brand * Add --html output option to xlscat * Force CSV parser when in-sep is given * Prefer Data::Peek over Data::Dumper if available 0.41 - 06 Oct 2010, H.Merijn Brand * Spell-check * Fixed requiring optional modules (RT#61928 - Roderick Schupp) 0.40 - 31 Mar 2010, H.Merijn Brand * Default option for clip fixed (RT#56151 - Alan James) 0.39 - 16 Mar 2010, H.Merijn Brand * Doc fix (RT#54507, Patrick Cronin) * Upped Copyright notices to 2010 * Drop YAML version to 1.0 0.38 - 15 Dec 2009, H.Merijn Brand * Add row () and cellrow () * Updated META.yml to meet most recent specs (optional_features = map) 0.37 - 09 Nov 2009, H.Merijn Brand * IO streams improvements * MANIFEST fix 0.36 - 06 Nov 2009, H.Merijn Brand * Add strip option * Spreadsheet::XLSX 0.12 still does not support attributes * Require Text::CSV_XS-0.69 for CSV for auto-detection of \r * New attribute "parser" to force format * Allow CSV streams * Allow SC streams * Allow XLS streams 0.35 - 03 Jun 2009, H.Merijn Brand * Add Test::NoWarnings, which is not run in AUTOMATED_TESTING * Switched to Test::More using tests_done () * Text::CSV_XS requires 0.43 or up, as we use ->eof () still prefer a really new release, like 0.65, which is Test::NoWarnings safe * Spreadsheet::XLSX 0.10 still does not support attributes * Added -n to xlscat * XLSX tests skip on feature, not on version 0.34 - 27 Jan 2009, H.Merijn Brand * Spreadsheet::XLSX 0.09 still does not support attributes still think it is better to follow closely. 0.09 is much better than 0.08 0.33 - 23 Jan 2009, H.Merijn Brand * A few Perl::Critic inspired changes * Modified tests to prevent rounding errors (we were not checking for that) * Added examples/ss-dups-tk.pl 0.32 - 06 Jan 2009, H.Merijn Brand * Add basic support for M$ Excel 2007 using Spreadsheet::XLSX * Test suite reports the parsers it found 0.31 - 04 Jan 2009, H.Merijn Brand * Upped Copyright notices to 2009 * Detection of percentage type * Even more reliable detection of Date types 0.30 - 22 Dec 2008, H.Merijn Brand * Wrong e-mail in META.yml * CSV files from a Mac, with \r as eol, would not parse 0.29 - 19 Oct 2008, H.Merijn Brand * Make Read safer for files that do not match extension, like HTML in foo.xls * YAML declared 1.4 (META.yml) instead of 1.1 (YAML) * Bring Makefile.PL in sync with META.yml * Recommend Text-CSV-0.56 0.28 - 04 Sep 2008, H.Merijn Brand * More tests on date formats * Declare Spreadsheet::ParseExcel::FmtDefault in META.yml * Add 'size' from Excel font size * Update docs about Excel quirks and CPAN links * Reference to public git repo * Some typo's 0.27 - 31 Aug 2008, H.Merijn Brand * Fixed META.yml (the specs are inconsistent) * Added --dtfmt to xlscat 0.26 - 29 Aug 2008, H.Merijn Brand * Added examples/xls2csv * Upped copyright to 2008 in examples * Don't ask to install examples under automated testing * die => croak * Added tgzdist target * Added encoding options to examples/xlscat * Added date-type checks for SS:PE > 0.32 0.25 - 02 Jan 2008, H.Merijn Brand * Spreadsheet-Read now under git * Upped copyrights to 2008 * Added all prereq's to Makefile.PL, even core mods * Tested under perl-5.10.0 * Text::CSV as of 1.00 is OK 0.24 - 05 Oct 2007, H.Merijn Brand * -? and --help in utils moved to Getopt::Long * Adjusted copyright notice in utils * removed prototypes in utils * next is illegal in do {} while (); (Johan Vromans) only happens with old Text::CSV_XS 0.23 - 21 Jun 2007, H.Merijn Brand * Use IO::Scalar instead of File::Temp when installed Thanks to David Cantrell for making a OpenBSD test box available! * use binmode () when opening files * Also use 3-arg open in test files * die if test files cannot be opene'ed 0.22 - 18 Jun 2007, H.Merijn Brand * 0.21 should already support Text::CSV_PP 1.05 Tested Text::CSV_PP 1.05 on bleadperl. * Better detection of (not) installed modules * Module requires perl 5.6.x 0.21 - 18 Jun 2007, H.Merijn Brand * Text::CSV_XS uses keep_meta_info instead of get_flags * Removed always_quote from xlscat's CSV output 0.20 - 31 May 2007, H.Merijn Brand * perlcritic OK * CSV parsing now uses getline (), and auto-detects eol Assumes first line does not contain embedded eol. This implies that parsing CSV with embedded eol sequences is now safe. * As I now also maintain Text::CSV_XS, I changed the references * Changed TODO's from Text::CSV to Text::CSV_PP (::CSV is dated 1997) 0.19 - 04 May 2007, H.Merijn Brand * Could not retreive '0' fields from OpenOffice (Jim Kelly) 0.18 - 27 Apr 2007, H.Merijn Brand * use strict in Makefile.PL * Added test_cover make target * Added "ods" for OpenOffice conversions * Added color tests for ods (but SR::RS doesn't support that yet) * Switched from \d to 0-9 in regexp * Added more test files and tests (increase coverage) 0.17 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --ansii to (try to) use the ansi colors for fields * Fixed a color attribute off-by-one error * Added test cases (not yet complete) * Added bold and underline 0.16 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --in-sep-char to force-define input sep-char for CSV * More debug lines * Parser name info in $ref->[0] * SquirrelCalc now reports Spreadsheet::Read and its version for parser info * Most of the attributes for Excel now implemented. Tested, but no test case 0.15 - 21 Jun 2006, H.Merijn Brand * Small doc change from AnnoCPAN * Sheets with undefined labels might cause havoc * Clip now skips empty xls sheets (TODO: sxc) * xlscat clips by default * xlscat new options -d and --noclip * xlscat usage () from -?/--help to STDOUT from fault to STDERR 0.14 - 20 Jan 2006, H.Merijn Brand * maxrow and maxcol were swapped in csv sheets * promoted internal debug flag to option * small doc changes 0.13 - 04 Nov 2005, H.Merijn Brand * Control attrib 'cells' was misinterpreted * New option: clip, default is true if {cell} is selected, false otherwise Removes trailing lines and columns in each sheet that have no visible data * new test t/11_call.t for checking options. Not complete yet * Added test_cover target to Makefile.PL 0.12 - 31 Oct 2005, H.Merijn Brand * Added ss2tk to examples 0.11 - 26 Oct 2005, H.Merijn Brand * Allow ods (OpenOffice 2.0) for sxc * include real ods test files and new test * Check if sc.version is undef, not 0 0.10 - 19 Sep 2005, H.Merijn Brand * More test coverage * cr2cell () returns "" for illegal col/row values * cell2cr () returns (0, 0) for illegal cell values * rows () tests even better for valid reference pointer * Renamed the test files 0.09 - 18 Sep 2005, H.Merijn Brand * Added Test::Pod * Added Test::Pod::Coverage * Spreadsheet::ReadSXC 0.20 now required (too many tests fail on 0.12) * Small changes to the docs * More secure handling of false values * Mention a bug in Spreadsheet::ParseExcel 0.08 - 22 Aug 2005, H.Merijn Brand * Slightly changed the Synopsis 0.07 - 06 Jul 2005, H.Merijn Brand * Added function rows () * Added function parses () * Made all modules optional * Prepared for Spreadsheet::Perl * Doc updates 0.06 - 22 Jun 2005, H.Merijn Brand * Repaired error in label names in metadata for SXC 0.05 - 17 Jun 2005, H.Merijn Brand * Spreadsheet::ReadSXC >= 0.20 supports sheet order * Spreadsheet::ReadSXC has new data structure (we still support the old) * Added "version" to the meta data for parser version * More tests 0.04 - 14 Jun 2005, H.Merijn Brand * Changed TODO * Added options "rc", and "cell" * Added CSV * Added CSV options "sep", and "quote" * Support xls from content * Added basic support for SquirrelCalc format * Updated pod * xlscat -R option for row selection was a one-off * xlscat now supports selecting fields with -F 0.03 - 19 May 2005, H.Merijn Brand * Expanded xlscat to support -i for index * Optionally install xlscat 0.02 - 19 May 2005, H.Merijn Brand * Typoes in the doc * Small change in organization so it actually installs 0.01 - 12 May 2005, H.Merijn Brand * Initial CPAN version. A lot can still change Spreadsheet-Read-0.63/META.yml0000644000031300001440000000266612606163731016547 0ustar00merijnusers00000000000000--- abstract: Meta-Wrapper for reading spreadsheet data author: - H.Merijn Brand configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: Author, CPAN::Meta::Converter version 2.150005 license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Spreadsheet-Read optional_features: opt_csv: description: Provides parsing of CSV streams requires: Text::CSV_XS: '0.71' opt_excel: description: Provides parsing of Microsoft Excel files requires: Spreadsheet::ParseExcel: '0.34' Spreadsheet::ParseExcel::FmtDefault: 0 opt_excelx: description: Provides parsing of Microsoft Excel 2007 files requires: Spreadsheet::ParseExcel::FmtDefault: 0 Spreadsheet::ParseXLSX: '0.13' opt_oo: description: Provides parsing of OpenOffice spreadsheets requires: Spreadsheet::ReadSXC: '0.20' opt_tools: description: Spreadsheet tools provides: Spreadsheet::Read: file: Read.pm version: '0.63' recommends: Data::Peek: '0.44' File::Temp: '0.2304' IO::Scalar: 0 Test::More: '1.001014' requires: Carp: 0 Data::Dumper: 0 Data::Peek: 0 Exporter: 0 File::Temp: '0.22' Test::Harness: 0 Test::More: '0.88' Test::NoWarnings: 0 perl: '5.006' resources: license: http://dev.perl.org/licenses/ repository: https://github.com/Tux/Spreadsheet-Read version: '0.63' Spreadsheet-Read-0.63/MANIFEST0000644000031300001440000000327512606163731016424 0ustar00merijnusers00000000000000Changes CONTRIBUTING.md examples/ss2tk examples/ssdiff examples/ss-dups-tk.pl examples/xlscat examples/xls2csv files/attr.ods files/attr.xls files/attr.xlsx files/blank.csv files/blank.xls files/blank.xlsx files/content.xml files/Dates.xls files/Dates.xlsx files/empty.csv files/empty.ods files/empty.sc files/empty.sxc files/empty.txt files/empty.xls files/empty.xlsx files/macosx.csv files/macosx.xls files/merged.ods files/merged.xls files/merged.xlsx files/misc.xls files/misc.xlsx files/misc_ws.xls files/perc.xls files/perc.xlsx files/test.csv files/test_m.csv files/test_m.txt files/test.ods files/test.sc files/test.sxc files/test.txt files/test_t.csv files/test_t.txt files/test_x.csv files/test_x.txt files/test.xls files/test.xlsx files/values.xls files/values.xlsx Makefile.PL MANIFEST README Read.pm t/00_pod.t t/01_pod.t t/10_basics.t t/11_call.t t/200_csv.t t/201_csv.t t/202_csv.t t/203_csv.t t/204_csv.t t/210_csv.t t/211_csv.t t/212_csv.t t/213_csv.t t/214_csv.t t/220_csv.t t/221_csv.t t/222_csv.t t/223_csv.t t/224_csv.t t/30_xls.t t/31_clr.t t/33_misc.t t/32_fmt.t t/34_dates.t t/35_perc.t t/36_xls.t t/37_merged.t t/40_sxc.t t/45_ods.t t/46_clr.t t/50_sc.t t/51_sc.t t/600_xlsx.t t/601_clr.t t/602_fmt.t t/603_misc.t t/604_dates.t t/605_perc.t t/607_merged.t t/610_xlsx.t t/611_clr.t t/612_fmt.t t/613_misc.t t/614_dates.t t/615_perc.t t/617_merged.t t/620_xlsx.t t/621_clr.t t/622_fmt.t t/623_misc.t t/624_dates.t t/625_perc.t t/627_merged.t t/630_xlsx.t t/631_clr.t t/632_fmt.t t/633_misc.t t/634_dates.t t/635_perc.t t/637_merged.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Spreadsheet-Read-0.63/Read.pm0000755000031300001440000013433212606161100016472 0ustar00merijnusers00000000000000#!/pro/bin/perl package Spreadsheet::Read; =head1 NAME Spreadsheet::Read - Read the data from a spreadsheet =head1 SYNOPSIS use Spreadsheet::Read; my $book = ReadData ("test.csv", sep => ";"); my $book = ReadData ("test.sxc"); my $book = ReadData ("test.ods"); my $book = ReadData ("test.xls"); my $book = ReadData ("test.xlsx"); my $book = ReadData ($fh, parser => "xls"); my $sheet = $book->[1]; # first datasheet my $cell = $book->[1]{A3}; # content of field A3 of sheet 1 my $cell = $book->[1]{cell}[1][3]; # same, unformatted =cut use strict; use warnings; our $VERSION = "0.63"; sub Version { $VERSION } use Carp; use Exporter; our @ISA = qw( Exporter ); our @EXPORT = qw( ReadData cell2cr cr2cell ); our @EXPORT_OK = qw( parses rows cellrow row ); use File::Temp qw( ); use Data::Dumper; my @parsers = ( [ csv => "Text::CSV_XS", "0.71" ], [ csv => "Text::CSV_PP", "1.17" ], [ csv => "Text::CSV", "1.17" ], [ ods => "Spreadsheet::ReadSXC", "0.20" ], [ sxc => "Spreadsheet::ReadSXC", "0.20" ], [ xls => "Spreadsheet::ParseExcel", "0.34" ], [ xlsx => "Spreadsheet::ParseXLSX", "0.13" ], [ xlsx => "Spreadsheet::XLSX", "0.13" ], [ xlsx => "Spreadsheet::XLSX::Reader::LibXML", "v9.99.99" ], [ prl => "Spreadsheet::Perl", "" ], # Helper modules [ ios => "IO::Scalar", "" ], [ dmp => "Data::Peek", "" ], ); my %can = map { my $preset = $ENV{"SPREADSHEET_READ_\U$_->[0]"}; if ($preset) { eval "require $preset"; if ($@) { $preset = "!$preset"; } else { # forcing a parser should still check the version for (grep { $_->[1] eq $preset and $_->[2] } @parsers) { my $ok; if ($_->[2] =~ m/^v([0-9.]+)/) { # clumsy versions my @min = split m/\./ => $1; my $has = $preset->VERSION; $has =~ s/^v//; my @has = split m/\./ => $has; $ok = (($has[0] * 1000 + $has[1]) * 1000 + $has[2]) >= (($min[0] * 1000 + $min[1]) * 1000 + $min[2]); } else { # normal versions $ok = $preset->VERSION >= $_->[2]; } $ok or $preset = "!$preset"; } } } $_->[0] => $preset || ""; } @parsers; for (@parsers) { my ($flag, $mod, $vsn) = @$_; $can{$flag} and next; eval "require $mod; \$vsn and ${mod}->VERSION (\$vsn); \$can{\$flag} = '$mod'"; #$@ && $@ !~ m{Can't locate} and warn "$mod: $@\n"; } $can{sc} = __PACKAGE__; # SquirelCalc is built-in $can{xlsx} =~ m/LibXML/ && $] < 5.012 and substr $can{xlsx}, 0, 0, "!"; # This parser requires perl 5.12 or newer my $debug = 0; my %def_opts = ( rc => 1, cells => 1, attr => 0, clip => undef, # $opt{cells}; strip => 0, dtfmt => "yyyy-mm-dd", # Format 14 debug => 0, parser => undef, sep => undef, quote => undef, ); my @def_attr = ( type => "text", fgcolor => undef, bgcolor => undef, font => undef, size => undef, format => undef, halign => "left", valign => "top", bold => 0, italic => 0, uline => 0, wrap => 0, merged => 0, hidden => 0, locked => 0, enc => "utf-8", # $ENV{LC_ALL} // $ENV{LANG} // ... ); # Helper functions sub _dump { my ($label, $ref) = @_; if ($can{dmp}) { print STDERR Data::Peek::DDumper ({ $label => $ref }); } else { print STDERR Data::Dumper->Dump ([$ref], [$label]); } } # _dump sub _parser { my $type = shift or return ""; $type = lc $type; # Aliases and fullnames $type eq "excel" and return "xls"; $type eq "excel2007" and return "xlsx"; $type eq "oo" and return "sxc"; $type eq "ods" and return "sxc"; $type eq "openoffice" and return "sxc"; $type eq "libreoffice" and return "sxc"; $type eq "perl" and return "prl"; $type eq "squirelcalc" and return "sc"; return exists $can{$type} ? $type : ""; } # _parser # Spreadsheet::Read::parses ("csv") or die "Cannot parse CSV" sub parses { my $type = _parser (shift) or return 0; $can{$type} =~ m/^!/ and return 0; return $can{$type}; } # parses # cr2cell (4, 18) => "D18" # No prototype to allow 'cr2cell (@rowcol)' sub cr2cell { my ($c, $r) = @_; defined $c && defined $r && $c > 0 && $r > 0 or return ""; my $cell = ""; while ($c) { use integer; substr $cell, 0, 0, chr (--$c % 26 + ord "A"); $c /= 26; } "$cell$r"; } # cr2cell # cell2cr ("D18") => (4, 18) sub cell2cr { my ($cc, $r) = (uc ($_[0]||"") =~ m/^([A-Z]+)([0-9]+)$/) or return (0, 0); my $c = 0; while ($cc =~ s/^([A-Z])//) { $c = 26 * $c + 1 + ord ($1) - ord ("A"); } ($c, $r); } # cell2cr # my @row = cellrow ($book->[1], 1); sub cellrow { my $sheet = shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { $s->[$_][$row] } 1..$sheet->{maxcol}; } # cellrow # my @row = row ($book->[1], 1); sub row { my $sheet = shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; map { $sheet->{cr2cell ($_, $row)} } 1..$sheet->{maxcol}; } # row # Convert {cell}'s [column][row] to a [row][column] list # my @rows = rows ($book->[1]); sub rows { my $sheet = shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { my $r = $_; [ map { $s->[$_][$r] } 1..$sheet->{maxcol} ]; } 1..$sheet->{maxrow}; } # rows # If option "clip" is set, remove the trailing rows and # columns in each sheet that contain no visible data sub _clipsheets { my ($opt, $ref) = @_; if (my $s = $opt->{strip} and $ref->[0]{sheets}) { foreach my $sheet (1 .. $ref->[0]{sheets}) { my $ss = $ref->[$sheet]; $ss->{maxrow} && $ss->{maxcol} or next; foreach my $row (1 .. $ss->{maxrow}) { foreach my $col (1 .. $ss->{maxcol}) { for (($opt->{rc} ? $ss->{cell} [$col][$row] : ()), ($opt->{cells} ? $ss->{cr2cell ($col, $row)} : ())) { defined or next; $s & 2 and s/\s+$//; $s & 1 and s/^\s+//; } } } } } $opt->{clip} or return $ref; foreach my $sheet (1 .. $ref->[0]{sheets}) { my $ss = $ref->[$sheet]; # Remove trailing empty columns while ($ss->{maxcol} and not ( grep { defined && m/\S/ } @{$ss->{cell}[$ss->{maxcol}]}) ) { (my $col = cr2cell ($ss->{maxcol}, 1)) =~ s/1$//; my $recol = qr{^$col(?=[0-9]+)$}; delete $ss->{$_} for grep m/$recol/, keys %{$ss}; $ss->{maxcol}--; } $ss->{maxcol} or $ss->{maxrow} = 0; # Remove trailing empty rows while ($ss->{maxrow} and not ( grep { defined && m/\S/ } map { $ss->{cell}[$_][$ss->{maxrow}] } 1 .. $ss->{maxcol} )) { my $rerow = qr{^[A-Z]+$ss->{maxrow}$}; delete $ss->{$_} for grep m/$rerow/, keys %{$ss}; $ss->{maxrow}--; } $ss->{maxrow} or $ss->{maxcol} = 0; } $ref; } # _clipsheets # Convert a single color (index) to a color sub _xls_color { my $clr = shift; defined $clr or return undef; $clr eq "#000000" and return undef; $clr =~ m/^#[0-9a-fA-F]+$/ and return lc $clr; $clr == 0 || $clr == 32767 and return undef; # Default fg color return "#" . lc Spreadsheet::ParseExcel->ColorIdxToRGB ($clr); } # _xls_color # Convert a fill [ $pattern, $front_color, $back_color ] to a single background sub _xls_fill { my ($p, $fg, $bg) = @_; defined $p or return undef; $p == 32767 and return undef; # Default fg color $p == 0 && !defined $bg and return undef; # No fill bg color $p == 1 and return _xls_color ($fg); $bg < 8 || $bg > 63 and return undef; # see Workbook.pm#106 return _xls_color ($bg); } # _xls_fill sub _xlsx_libxml { my $oBook = shift; my @names = @{$oBook->get_worksheet_names}; $oBook->{SheetCount} = scalar @names; $oBook->{Worksheet} = [ ]; my %mm; while (my $wks = $oBook->worksheet) { push @{$oBook->{Worksheet}}, $wks; $wks->{Cells} = []; $wks->{Name} = shift @names; ($wks->{MinRow}, $wks->{MaxRow}) = $wks->row_range; ($wks->{MinCol}, $wks->{MaxCol}) = $wks->col_range; $wks->{MinRow} < 0 and $wks->{MinRow} = 0; $wks->{MinCol} < 0 and $wks->{MinCol} = 0; foreach my $r ($wks->{MinRow} .. $wks->{MaxRow}) { foreach my $c ($wks->{MinCol} .. $wks->{MaxCol}) { my $cell = $wks->get_cell ($r, $c); if (defined $cell and ref $cell) { $cell->{Val} = $cell->unformatted; $cell->{Merged} = $cell->is_merged and $mm{$cell->{cell_merge}}{"$r:$c"} = $cell; $cell->{Type} = $cell->type; $cell->{Hidden} = 0;#$cell->is_hidden; NYI } else { $cell = { Val => undef, Type => "Undef", Merged => 0, Hidden => 0, }; } $wks->{Cells}[$r][$c] = $cell; } } # Spreadsheet::XLSX::Reader::LibXML returns all other cells in range as undef foreach my $mm (values %mm) { my @mr = sort keys %$mm; foreach my $rc (@mr) { defined $mm->{$rc}{Val} or $mm->{$rc}{Val} = ""; } } } *Spreadsheet::XLSX::Reader::LibXML::Cell::Value = sub { my $cell = shift; $cell->value; }; *WorksheetInstance::get_merged_areas = sub { my $wi = shift or return; my $mm = eval { $wi->_get_merge_map } || eval { $wi->_merge_map } or return; # [ undef, # [ undef, # undef, # 'B1:C2', # 'B1:C2' # ], # [ undef, # 'A2:A3', # 'B1:C2', # 'B1:C2' # ], # [ undef, # 'A2:A3' # ] # ] # -> # [ [ 1, 0, # A2: # 2, 0, # A3 # ], # [ 0, 1, # B1: # 1, 2, # C2 # ] # ] my %r; for (@$mm) { $_ && $r{$_}++ for @$_ } keys %r or return; my @r; foreach my $ma (keys %r) { my ($ul, $br) = split m/:/ => $ma or return; push @r, [ reverse map { $_ - 1 } map { cell2cr ($_) } $br, $ul ]; } return \@r; }; } # _xlsx_libxml sub ReadData { my $txt = shift or return; my %opt; if (@_) { if (ref $_[0] eq "HASH") { %opt = %{shift @_} } elsif (@_ % 2 == 0) { %opt = @_ } } exists $opt{rc} or $opt{rc} = $def_opts{rc}; exists $opt{cells} or $opt{cells} = $def_opts{cells}; exists $opt{attr} or $opt{attr} = $def_opts{attr}; exists $opt{clip} or $opt{clip} = $opt{cells}; exists $opt{strip} or $opt{strip} = $def_opts{strip}; exists $opt{dtfmt} or $opt{dtfmt} = $def_opts{dtfmt}; # $debug = $opt{debug} // 0; $debug = defined $opt{debug} ? $opt{debug} : $def_opts{debug}; $debug > 4 and _dump (Options => \%opt); my %parser_opts = map { $_ => $opt{$_} } grep { !exists $def_opts{$_} } keys %opt; my $io_ref = ref ($txt) =~ m/GLOB|IO/ ? $txt : undef; my $io_fil = $io_ref ? 0 : do { no warnings "newline"; -f $txt ? 1 : 0 }; my $io_txt = $io_ref || $io_fil ? 0 : 1; $io_fil && ! -s $txt and return; $io_ref && eof ($txt) and return; if ($opt{parser} ? _parser ($opt{parser}) eq "csv" : ($io_fil && $txt =~ m/\.(csv)$/i)) { $can{csv} or croak "CSV parser not installed"; my $label = $io_fil ? $txt : "IO"; $debug and print STDERR "Opening CSV $label\n"; my @data = ( { type => "csv", parser => $can{csv}, version => $can{csv}->VERSION, error => undef, quote => '"', sepchar => ',', sheets => 1, sheet => { $label => 1 }, }, { label => $label, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], }, ); my ($sep, $quo, $in) = (",", '"'); defined $opt{sep} and $sep = $opt{sep}; defined $opt{quote} and $quo = $opt{quote}; if ($io_fil) { unless (defined $opt{quote} && defined $opt{sep}) { open $in, "<", $txt or return; $_ = <$in>; $quo = defined $opt{quote} ? $opt{quote} : '"'; $sep = # If explicitly set, use it defined $opt{sep} ? $opt{sep} : # otherwise start auto-detect with quoted strings m/["0-9];["0-9;]/ ? ";" : m/["0-9],["0-9,]/ ? "," : m/["0-9]\t["0-9,]/ ? "\t" : # If neither, then for unquoted strings m/\w;[\w;]/ ? ";" : m/\w,[\w,]/ ? "," : m/\w\t[\w,]/ ? "\t" : "," ; close $in; } open $in, "<", $txt or return; } else { $in = $txt; # Now pray ... } $debug > 1 and print STDERR "CSV sep_char '$sep', quote_char '$quo'\n"; my $csv = $can{csv}->new ({ %parser_opts, sep_char => ($data[0]{sepchar} = $sep), quote_char => ($data[0]{quote} = $quo), keep_meta_info => 1, binary => 1, auto_diag => 1, }) or croak "Cannot create a csv ('$sep', '$quo') parser!"; while (my $row = $csv->getline ($in)) { my @row = @$row or last; my $r = ++$data[1]{maxrow}; @row > $data[1]{maxcol} and $data[1]{maxcol} = @row; foreach my $c (0 .. $#row) { my $val = $row[$c]; my $cell = cr2cell ($c + 1, $r); $opt{rc} and $data[1]{cell}[$c + 1][$r] = $val; $opt{cells} and $data[1]{$cell} = $val; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; } } $csv->eof () or $data[0]{error} = [ $csv->error_diag ]; close $in; for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } # From /etc/magic: Microsoft Office Document if ($io_txt && _parser ($opt{parser}) !~ m/^xlsx?$/ && $txt =~ m{^(\376\067\0\043 |\320\317\021\340\241\261\032\341 |\333\245-\0\0\0)}x) { $can{xls} or croak "Spreadsheet::ParseExcel not installed"; my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".xls", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or return; $io_txt = 0; $opt{parser} = "xls"; } my $_parser; if ($opt{parser} ? ($_parser = _parser ($opt{parser})) =~ m/^xlsx?$/ : ($io_fil && $txt =~ m/\.(xlsx?)$/i && ($_parser = $1))) { my $parse_type = $_parser =~ m/x$/i ? "XLSX" : "XLS"; my $parser = $can{lc $parse_type} or croak "Parser for $parse_type is not installed"; my $xlsx_libxml = $parser =~ m/LibXML$/; $debug and print STDERR "Opening $parse_type \$txt\n"; my $oBook = eval { $io_ref ? $parse_type eq "XLSX" ? $can{xlsx} =~ m/::XLSX$/ ? $parser->new ($io_ref) : $parser->new (%parser_opts)->parse ($io_ref) : $parser->new (%parser_opts)->Parse ($io_ref) : $parse_type eq "XLSX" ? $can{xlsx} =~ m/::XLSX$/ ? $parser->new ($txt) : $parser->new (%parser_opts)->parse ($txt) : $parser->new (%parser_opts)->Parse ($txt); }; unless ($oBook) { # cleanup will fail on folders with spaces. (my $msg = $@) =~ s/ at \S+ line \d+.*//s; croak "$parse_type parser cannot parse data: $msg"; } $debug > 8 and _dump (oBook => $oBook); $xlsx_libxml and _xlsx_libxml ($oBook); my @data = ( { type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, error => undef, sheets => $oBook->{SheetCount} || 0, sheet => {}, } ); # Overrule the default date format strings my %def_fmt = ( 0x0E => lc $opt{dtfmt}, # m-d-yy 0x0F => "d-mmm-yyyy", # d-mmm-yy 0x11 => "mmm-yyyy", # mmm-yy 0x16 => "yyyy-mm-dd hh:mm", # m-d-yy h:mm ); $oBook->{FormatStr}{$_} = $def_fmt{$_} for keys %def_fmt; my $oFmt = $parse_type eq "XLSX" ? $can{xlsx} =~ m/::XLSX$/ ? Spreadsheet::XLSX::Fmt2007->new : $can{xlsx} =~ m/::XLSX/ ? Spreadsheet::XLSX::Reader::LibXML::FmtDefault->new : Spreadsheet::ParseExcel::FmtDefault->new : Spreadsheet::ParseExcel::FmtDefault->new; $debug and print STDERR "\t$data[0]{sheets} sheets\n"; foreach my $oWkS (@{$oBook->{Worksheet}}) { $opt{clip} and !defined $oWkS->{Cells} and next; # Skip empty sheets my %sheet = ( label => $oWkS->{Name}, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], ); defined $sheet{label} or $sheet{label} = "-- unlabeled --"; exists $oWkS->{MinRow} and $sheet{minrow} = $oWkS->{MinRow} + 1; exists $oWkS->{MaxRow} and $sheet{maxrow} = $oWkS->{MaxRow} + 1; exists $oWkS->{MinCol} and $sheet{mincol} = $oWkS->{MinCol} + 1; exists $oWkS->{MaxCol} and $sheet{maxcol} = $oWkS->{MaxCol} + 1; $sheet{merged} = [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map {[ $_, pack "NNNN", @$_ ]} map {[ map { $_ + 1 } @{$_}[1,0,3,2] ]} @{$oWkS->get_merged_areas || []}]; my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; if (exists $oWkS->{MinRow}) { if ($opt{clip}) { my ($mr, $mc) = (-1, -1); foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; defined (my $val = $oWkC->{Val}) or next; $val eq "" and next; $r > $mr and $mr = $r; $c > $mc and $mc = $c; } } ($sheet{maxrow}, $sheet{maxcol}) = ($mr + 1, $mc + 1); } foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; #defined (my $val = $oWkC->{Val}) or next; my $val = $oWkC->{Val}; my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet{cell}[$c + 1][$r + 1] = $val; # Original my $fmt; my $FmT = $oWkC->{Format}; if ($FmT) { unless (ref $FmT) { $fmt = $FmT; $FmT = {}; } } else { $FmT = {}; } foreach my $attr (qw( AlignH AlignV FmtIdx Hidden Lock Wrap )) { exists $FmT->{$attr} or $FmT->{$attr} = 0; } exists $FmT->{Fill} or $FmT->{Fill} = [ 0 ]; exists $FmT->{Font} or $FmT->{Font} = undef; if ($xlsx_libxml and ref $oWkC eq "Spreadsheet::XLSX::Reader::LibXML::Cell" and my $style = $oWkC->get_fill) { if (my $pf = $style->{patternFill}) { #defined $pf->{fgColor}{indexed} and $FmT->{Font}{Color} = $pf->{fgColor}{indexed}; #defined $pf->{bgColor}{indexed} and $FmT->{Fill} = [ $pf->{bgColor}{indexed} ]; } } unless (defined $fmt) { $fmt = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; } if ($oWkC->{Type} eq "Numeric") { # Fixed in 0.33 and up # see Spreadsheet/ParseExcel/FmtDefault.pm $FmT->{FmtIdx} == 0x0e || $FmT->{FmtIdx} == 0x0f || $FmT->{FmtIdx} == 0x10 || $FmT->{FmtIdx} == 0x11 || $FmT->{FmtIdx} == 0x16 || (defined $fmt && $fmt =~ m{^[dmy][-\\/dmy]*$}) and $oWkC->{Type} = "Date"; $FmT->{FmtIdx} == 0x09 || $FmT->{FmtIdx} == 0x0a || (defined $fmt && $fmt =~ m{^0+\.0+%$}) and $oWkC->{Type} = "Percentage"; } defined $fmt and $fmt =~ s/\\//g; $opt{cells} and # Formatted value $sheet{$cell} = defined $val ? $FmT && exists $def_fmt{$FmT->{FmtIdx}} ? $oFmt->ValFmt ($oWkC, $oBook) : $oWkC->Value : undef; if ($opt{attr}) { my $FnT = $FmT->{Font}; my $fmi = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; $fmi and $fmi =~ s/\\//g; $sheet{attr}[$c + 1][$r + 1] = { @def_attr, type => lc $oWkC->{Type}, enc => $oWkC->{Code}, merged => (defined $oWkC->{Merged} ? $oWkC->{Merged} : $oWkC->is_merged) || 0, hidden => (defined $oWkC->{Hidden} ? $oWkC->{Hidden} : $FmT->{Hidden}) || 0, locked => $FmT->{Lock} || 0, format => $fmi, halign => [ undef, qw( left center right fill justify ), undef, "equal_space" ]->[$FmT->{AlignH}], valign => [ qw( top center bottom justify equal_space )]->[$FmT->{AlignV}], wrap => $FmT->{Wrap}, font => $FnT->{Name}, size => $FnT->{Height}, bold => $FnT->{Bold}, italic => $FnT->{Italic}, uline => $FnT->{Underline}, fgcolor => _xls_color ($FnT->{Color}), bgcolor => _xls_fill (@{$FmT->{Fill}}), }; #_dump "cell", $sheet{attr}[$c + 1][$r + 1]; } } } } for (@{$sheet{cell}}) { defined or $_ = []; } push @data, { %sheet }; # $data[0]{sheets}++; if ($sheet{label} eq "-- unlabeled --") { $sheet{label} = ""; } else { $data[0]{sheet}{$sheet{label}} = $#data; } } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "sc" : $io_fil ? $txt =~ m/\.sc$/ : $txt =~ m/^# .*SquirrelCalc/) { if ($io_ref) { local $/; my $x = <$txt>; $txt = $x; } elsif ($io_fil) { local $/; open my $sc, "<", $txt or return; $txt = <$sc>; close $sc; } $txt =~ m/\S/ or return; my @data = ( { type => "sc", parser => "Spreadsheet::Read", version => $VERSION, error => undef, sheets => 1, sheet => { sheet => 1 }, }, { label => "sheet", maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], }, ); for (split m/\s*[\r\n]\s*/, $txt) { if (m/^dimension.*of ([0-9]+) rows.*of ([0-9]+) columns/i) { @{$data[1]}{qw(maxrow maxcol)} = ($1, $2); next; } s/^r([0-9]+)c([0-9]+)\s*=\s*// or next; my ($c, $r) = map { $_ + 1 } $2, $1; if (m/.* \{(.*)}$/ or m/"(.*)"/) { my $cell = cr2cell ($c, $r); $opt{rc} and $data[1]{cell}[$c][$r] = $1; $opt{cells} and $data[1]{$cell} = $1; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; next; } # Now only formula's remain. Ignore for now # r67c7 = [P2L] 2*(1000*r67c5-60) } for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "sxc" : ($txt =~ m/^<\?xml/ or -f $txt)) { $can{sxc} or croak "Spreadsheet::ReadSXC not installed"; my $sxc_options = { %parser_opts, OrderBySheet => 1 }; # New interface 0.20 and up my $sxc; if ($txt =~ m/\.(sxc|ods)$/i) { $debug and print STDERR "Opening \U$1\E $txt\n"; $sxc = Spreadsheet::ReadSXC::read_sxc ($txt, $sxc_options) or return; } elsif ($txt =~ m/\.xml$/i) { $debug and print STDERR "Opening XML $txt\n"; $sxc = Spreadsheet::ReadSXC::read_xml_file ($txt, $sxc_options) or return; } # need to test on pattern to prevent stat warning # on filename with newline elsif ($txt !~ m/^<\?xml/i and -f $txt) { $debug and print STDERR "Opening XML $txt\n"; open my $f, "<", $txt or return; local $/; $txt = <$f>; close $f; } !$sxc && $txt =~ m/^<\?xml/i and $sxc = Spreadsheet::ReadSXC::read_xml_string ($txt, $sxc_options); $debug > 8 and _dump (sxc => $sxc); if ($sxc) { my @data = ( { type => "sxc", parser => "Spreadsheet::ReadSXC", version => $Spreadsheet::ReadSXC::VERSION, error => undef, sheets => 0, sheet => {}, } ); my @sheets = ref $sxc eq "HASH" # < 0.20 ? map { { label => $_, data => $sxc->{$_}, } } keys %$sxc : @{$sxc}; foreach my $sheet (@sheets) { my @sheet = @{$sheet->{data}}; my %sheet = ( label => $sheet->{label}, maxrow => scalar @sheet, maxcol => 0, cell => [], attr => [], merged => [], ); my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} rows\n"; foreach my $r (0 .. $#sheet) { my @row = @{$sheet[$r]} or next; foreach my $c (0 .. $#row) { defined (my $val = $row[$c]) or next; my $C = $c + 1; $C > $sheet{maxcol} and $sheet{maxcol} = $C; my $cell = cr2cell ($C, $r + 1); $opt{rc} and $sheet{cell}[$C][$r + 1] = $val; $opt{cells} and $sheet{$cell} = $val; $opt{attr} and $sheet{attr}[$C][$r + 1] = { @def_attr }; } } for (@{$sheet{cell}}) { defined or $_ = []; } $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; push @data, { %sheet }; $data[0]{sheets}++; $data[0]{sheet}{$sheet->{label}} = $#data; } return _clipsheets \%opt, [ @data ]; } } return; } # ReadData 1; __END__ =head1 DESCRIPTION Spreadsheet::Read tries to transparently read *any* spreadsheet and return its content in a universal manner independent of the parsing module that does the actual spreadsheet scanning. For OpenOffice and/or LibreOffice this module uses L For Microsoft Excel this module uses L, L, or L (discouraged). For CSV this module uses L or L. For SquirrelCalc there is a very simplistic built-in parser =head2 Data structure The data is returned as an array reference: $book = [ # Entry 0 is the overall control hash { sheets => 2, sheet => { "Sheet 1" => 1, "Sheet 2" => 2, }, type => "xls", parser => "Spreadsheet::ParseExcel", version => 0.59, error => undef, }, # Entry 1 is the first sheet { label => "Sheet 1", maxrow => 2, maxcol => 4, cell => [ undef, [ undef, 1 ], [ undef, undef, undef, undef, undef, "Nugget" ], ], attr => [], merged => [], A1 => 1, B5 => "Nugget", }, # Entry 2 is the second sheet { label => "Sheet 2", : : To keep as close contact to spreadsheet users, row and column 1 have index 1 too in the C element of the sheet hash, so cell "A1" is the same as C [1, 1] (column first). To switch between the two, there are two helper functions available: C and C. The C hash entry contains unformatted data, while the hash entries with the traditional labels contain the formatted values (if applicable). The control hash (the first entry in the returned array ref), contains some spreadsheet meta-data. The entry C is there to be able to find the sheets when accessing them by name: my %sheet2 = %{$book->[$book->[0]{sheet}{"Sheet 2"}]}; =head2 Functions =head3 ReadData my $book = ReadData ($source [, option => value [, ... ]]); my $book = ReadData ("file.csv", sep => ',', quote => '"'); my $book = ReadData ("file.xls", dtfmt => "yyyy-mm-dd"); my $book = ReadData ("file.ods"); my $book = ReadData ("file.sxc"); my $book = ReadData ("content.xml"); my $book = ReadData ($content); my $book = ReadData ($fh, parser => "xls"); Tries to convert the given file, string, or stream to the data structure described above. Processing Excel data from a stream or content is supported through a L temporary file or L when available. L does preserve sheet order as of version 0.20. Currently supported options are: =over 2 =item parser X Force the data to be parsed by a specific format. Possible values are C, C (or C), C (or C), C (or C, C, C, C) C (or C), and C (or C). When parsing streams, instead of files, it is highly recommended to pass this option. Spreadsheet::Read supports several underlying parsers per spreadsheet type. It will try those from most favored to least favored. When you have a good reason to prefer a different parser, you can set that in environment variables. The other options then will not be tested for: env SPREADSHEET_READ_CSV=Text::CSV_PP ... =item cells X Control the generation of named cells ("C" etc). Default is true. =item rc Control the generation of the {cell}[c][r] entries. Default is true. =item attr Control the generation of the {attr}[c][r] entries. Default is false. See L below. =item clip If set, L|/ReadData> will remove all trailing rows and columns per sheet that have no visual data. If a sheet has no data at all, the sheet will be skipped entirely when this attribute is true. This option is only valid if L|/cells> is true. The default value is true if L|/cells> is true, and false otherwise. =item strip If set, L|/ReadData> will remove trailing- and/or leading-whitespace from every field. strip leading strailing ----- ------- --------- 0 n/a n/a 1 strip n/a 2 n/a strip 3 strip strip =item sep Set separator for CSV. Default is comma C<,>. =item quote Set quote character for CSV. Default is C<">. =item dtfmt Set the format for MS-Excel date fields that are set to use the default date format. The default format in Excel is "C", which is both not year 2000 safe, nor very useful. The default is now "C", which is more ISO-like. Note that date formatting in MS-Excel is not reliable at all, as it will store/replace/change the date field separator in already stored formats if you change your locale settings. So the above mentioned default can be either "C" OR "C" depending on what that specific character happened to be at the time the user saved the file. =item debug Enable some diagnostic messages to STDERR. The value determines how much diagnostics are dumped (using L). A value of C<9> and higher will dump the entire structure from the back-end parser. =back All other attributes/options will be passed to the underlying parser if that parser supports attributes. =head3 cr2cell my $cell = cr2cell (col, row) C converts a C<(column, row)> pair (1 based) to the traditional cell notation: my $cell = cr2cell ( 4, 14); # $cell now "D14" my $cell = cr2cell (28, 4); # $cell now "AB4" =head3 cell2cr my ($col, $row) = cell2cr ($cell) C converts traditional cell notation to a C<(column, row)> pair (1 based): my ($col, $row) = cell2cr ("D14"); # returns ( 4, 14) my ($col, $row) = cell2cr ("AB4"); # returns (28, 4) =head3 row my @row = row ($sheet, $row) my @row = Spreadsheet::Read::row ($book->[1], 3) Get full row of formatted values (like C<< $sheet->{A3} .. $sheet->{G3} >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 cellrow my @row = cellrow ($sheet, $row) my @row = Spreadsheet::Read::cellrow ($book->[1], 3) Get full row of unformatted values (like C<< $sheet->{cell}[1][3] .. $sheet->{cell}[7][3] >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 rows my @rows = rows ($sheet) my @rows = Spreadsheet::Read::rows ($book->[1]) Convert C<{cell}>'s C<[column][row]> to a C<[row][column]> list. Note that the indexes in the returned list are 0-based, where the index in the C<{cell}> entry is 1-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 parses parses ($format) Spreadsheet::Read::parses ("CSV") C returns Spreadsheet::Read's capability to parse the required format. L|/ReadData> will pick its preferred parser for that format unless overruled. See L|/parser>. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 Version my $v = Version () my $v = Spreadsheet::Read::Version () my $v = Spreadsheet::Read->VERSION; Returns the current version of Spreadsheet::Read. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. This function returns exactly the same as C<< Spreadsheet::Read->VERSION >> returns and is only kept for backward compatibility reasons. =head2 Using CSV In case of CSV parsing, L|/ReadData> will use the first line of the file to auto-detect the separation character if the first argument is a file and both C and C are not passed as attributes. L (or L) is able to automatically detect and use C<\r> line endings. CSV can parse streams too, but be sure to pass C and/or C if these do not match the default C<,> and C<">. When an error is found in the CSV, it is automatically reported (to STDERR). The structure will store the error in C<< $ss->[0]{error} >> as anonymous list returned by Lerror_diag >>|https://metacpan.org/pod/Text::CSV_XS#error_diag>. See L for documentation. my $ss = ReadData ("bad.csv"); $ss->[0]{error} and say $ss->[0]{error}[1]; =head2 Cell Attributes X If the constructor was called with C having a true value, effort is made to analyze and store field attributes like this: { label => "Sheet 1", maxrow => 5, maxcol => 2, cell => [ undef, [ undef, 1 ], [ undef, undef, undef, undef, undef, "Nugget" ], ], attr => [ undef, [ undef, { type => "numeric", fgcolor => "#ff0000", bgcolor => undef, font => "Arial", size => undef, format => "## ##0.00", halign => "right", valign => "top", uline => 0, bold => 0, italic => 0, wrap => 0, merged => 0, hidden => 0, locked => 0, enc => "utf-8", }, ] [ undef, undef, undef, undef, undef, { type => "text", fgcolor => "#e2e2e2", bgcolor => undef, font => "Letter Gothic", size => 15, format => undef, halign => "left", valign => "top", uline => 0, bold => 0, italic => 0, wrap => 0, merged => 0, hidden => 0, locked => 0, enc => "iso8859-1", }, ] merged => [], A1 => 1, B5 => "Nugget", }, This has now been partially implemented, mainly for Excel, as the other parsers do not (yet) support all of that. YMMV. =head3 Merged cells Note that only L documents the use of merged cells, and not in a way useful for the spreadsheet consumer. CSV does not support merged cells (though future implementations of CSV for the web might). The documentation of merged areas in L and L can be found in L and L. None of basic L, L, and L manual pages mention merged cells at all. This module just tries to return the information in a generic way. Given this spreadsheet as an example merged.xlsx: A B C +-----+-----------+ 1| | foo | +-----+ + 2| bar | | | +-----+-----+ 3| | urg | orc | +-----+-----+-----+ the information extracted from that undocumented information is returned in the C entry of the sheet's hash as a list of top-left, bottom-right coordinate pars (col, row, col, row). For given example, that would be: $ss->{merged} = [ [ 1, 2, 1, 3 ], # A2-A3 [ 2, 1, 3, 2 ], # B1-C2 ]; When the attributes are also enabled, there is some merge information copied directly from the cell information, but again, that stems from code analysis and not from documentation: my $ss = ReadData ("merged.xlsx", attr => 1)->[1]; foreach my $row (1 .. $ss->{maxrow}) { foreach my $col (1 .. $ss->{maxcol}) { my $cell = cr2cell ($col, $row); printf "%s %-3s %d ", $cell, $ss->{$cell}, $ss->{attr}[$col][$row]{merged}; } print "\n"; } A1 0 B1 foo 1 C1 1 A2 bar 1 B2 1 C2 1 A3 1 B3 urg 0 C3 orc 0 In this example, there is no way to see if C is merged to C or to C without analyzing all surrounding cells. This could as well mean C, C, C, as C, C, C, as C, C. Use the L|/merged> entry described above to find out what fields are merged to what other fields. =head1 TOOLS This modules comes with a few tools that perform tasks from the FAQ, like "How do I select only column D through F from sheet 2 into a CSV file?" If the module was installed without the tools, you can find them here: https://github.com/Tux/Spreadsheet-Read/tree/master/examples =head2 C Show (parts of) a spreadsheet in plain text, CSV, or HTML usage: xlscat [-s ] [-L] [-n] [-A] [-u] [Selection] file.xls [-c | -m] [-u] [Selection] file.xls -i [-S sheets] file.xls Generic options: -v[#] Set verbose level (xlscat/xlsgrep) -d[#] Set debug level (Spreadsheet::Read) -u Use unformatted values --noclip Do not strip empty sheets and trailing empty rows and columns -e Set encoding for input and output -b Set encoding for input -a Set encoding for output Input CSV: --in-sep=c Set input sep_char for CSV Input XLS: --dtfmt=fmt Specify the default date format to replace 'm-d-yy' the default replacement is 'yyyy-mm-dd' Output Text (default): -s Use separator . Default '|', \n allowed -L Line up the columns -n [skip] Number lines (prefix with column number) optionally skip (header) lines -A Show field attributes in ANSI escapes -h[#] Show # header lines Output Index only: -i Show sheet names and size only Output CSV: -c Output CSV, separator = ',' -m Output CSV, separator = ';' Output HTML: -H Output HTML Selection: -S Only print sheets . 'all' is a valid set Default only prints the first sheet -R Only print rows . Default is 'all' -C Only print columns . Default is 'all' -F Only fields e.g. -FA3,B16 Ordering (column numbers in result set *after* selection): --sort=spec Sort output (e.g. --sort=3,2r,5n,1rn+2) +# - first # lines do not sort (header) # - order on column # lexical ascending #n - order on column # numeric ascending #r - order on column # lexical descending #rn - order on column # numeric descending =head2 C Show (parts of) a spreadsheet that match a pattern in plain text, CSV, or HTML usage: xlsgrep [-s ] [-L] [-n] [-A] [-u] [Selection] pattern file.xls [-c | -m] [-u] [Selection] pattern file.xls -i [-S sheets] pattern file.xls Generic options: -v[#] Set verbose level (xlscat/xlsgrep) -d[#] Set debug level (Spreadsheet::Read) -u Use unformatted values --noclip Do not strip empty sheets and trailing empty rows and columns -e Set encoding for input and output -b Set encoding for input -a Set encoding for output Input CSV: --in-sep=c Set input sep_char for CSV Input XLS: --dtfmt=fmt Specify the default date format to replace 'm-d-yy' the default replacement is 'yyyy-mm-dd' Output Text (default): -s Use separator . Default '|', \n allowed -L Line up the columns -n [skip] Number lines (prefix with column number) optionally skip (header) lines -A Show field attributes in ANSI escapes -h[#] Show # header lines Grep options: -i Ignore case -w Match whole words only Output CSV: -c Output CSV, separator = ',' -m Output CSV, separator = ';' Output HTML: -H Output HTML Selection: -S Only print sheets . 'all' is a valid set Default only prints the first sheet -R Only print rows . Default is 'all' -C Only print columns . Default is 'all' -F Only fields e.g. -FA3,B16 Ordering (column numbers in result set *after* selection): --sort=spec Sort output (e.g. --sort=3,2r,5n,1rn+2) +# - first # lines do not sort (header) # - order on column # lexical ascending #n - order on column # numeric ascending #r - order on column # lexical descending #rn - order on column # numeric descending =head2 C Convert a spreadsheet to CSV. This is just a small wrapper over C. usage: xls2csv [ -o file.csv ] file.xls =head2 C Show a spreadsheet in a perl/Tk spreadsheet widget usage: ss2tk [-w ] [X11 options] file.xls [] -w use as default column width (4) =head2 C Show the differences between two spreadsheets. usage: examples/ssdiff [--verbose[=1]] file.xls file.xlsx =head1 TODO =over 4 =item Options =over 2 =item Module Options New Spreadsheet::Read options are bound to happen. I'm thinking of an option that disables the reading of the data entirely to speed up an index request (how many sheets/fields/columns). See C. =item Parser options Try to transparently support as many options as the encapsulated modules support regarding (un)formatted values, (date) formats, hidden columns rows or fields etc. These could be implemented like C above but names C, or just be new values in the C hashes. =back =item Other spreadsheet formats I consider adding any spreadsheet interface that offers a usable API. =item Alternative parsers for existing formats As long as the alternative has a good reason for its existence, and the API of that parser reasonable fits in my approach, I will consider to implement the glue layer, or apply patches to do so as long as these match what F describes. =item Add an OO interface Consider making the ref an object, though I currently don't see the big advantage (yet). Maybe I'll make it so that it is a hybrid functional / OO interface. =back =head1 SEE ALSO =over 2 =item Text::CSV_XS, Text::CSV_PP See L , L , and L documentation. L is a wrapper over Text::CSV_XS (the fast XS version) and/or L (the pure perl version). =item Spreadsheet::ParseExcel L is the best parser for old-style Microsoft Excel (.xls) files. =item Spreadsheet::ParseXLSX L is like L, but for new Microsoft Excel 2007+ files (.xlsx). They have the same API. This module uses L to parse the internal XML. =item Spreadsheet::XLSX::Reader::LibXML L is an alternative Microsoft 2007+ parser that uses L to parse the internal XML. Work in progress. Much is relying on undocumented internals. The author gave up on making this work, so it is not enabled by default. Feel free submit patches to make it work. =item Spreadsheet::XLSX See L documentation. This module is dead and deprecated. It is B. I use L instead. =item Spreadsheet::ReadSXC L is a parser for OpenOffice/LibreOffice (.sxc and .ods) spreadsheet files. =item Spreadsheet::BasicRead See L for xlscat-like functionality (Excel only) =item Spreadsheet::ConvertAA See L for an alternative set of L/L pair. =item Spreadsheet::Perl L offers a Pure Perl implementation of a spreadsheet engine. Users that want this format to be supported in Spreadsheet::Read are hereby motivated to offer patches. It is not high on my TODO-list. =item Spreadsheet::CSV L offers the interesting approach of seeing all supported spreadsheet formats as if it were CSV, mimicking the L interface. =item xls2csv L offers an alternative for my C, in the xls2csv tool, but this tool focuses on character encoding transparency, and requires some other modules. =back =head1 AUTHOR H.Merijn Brand, =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2015 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.63/Makefile.PL0000644000031300001440000000600012561044434017230 0ustar00merijnusers00000000000000use strict; require 5.006; use ExtUtils::MakeMaker; use File::Copy; sub link_or_copy { my ($source, $dest) = @_; link ($source, $dest) or copy ($source, $dest); } # link_or_copy my @exe; unless (exists $ENV{AUTOMATED_TESTING} and $ENV{AUTOMATED_TESTING} == 1) { -f "examples/xlsgrep" or link_or_copy "examples/xlscat", "examples/xlsgrep"; for ( [ "xlscat", "Convert Spreadsheet to plain text or CSV" ], [ "xlsgrep", "Grep pattern from Spreadsheet" ], [ "ss2tk", "Show a Spreadsheet in Perl/Tk" ], [ "ssdiff", "Show diff between two spreadsheets" ], [ "xls2csv", "Wrapper around xlscat for easy XLS => CSV" ], ) { prompt ("Do you want to install '$_->[0]' ($_->[1]) ? ", "y") =~ m/[Yy]/ and push @exe, "examples/$_->[0]"; } } my %wm = ( NAME => "Spreadsheet::Read", DISTNAME => "Spreadsheet-Read", ABSTRACT => "Read the data from a spreadsheet", AUTHOR => "H.Merijn Brand ", VERSION_FROM => "Read.pm", EXE_FILES => [ @exe ], PREREQ_FATAL => 0, PREREQ_PM => { # Core modules "Exporter" => 0, "Carp" => 0, "Data::Dumper" => 0, "File::Temp" => 0.22, "IO::Scalar" => 0, # Optional # Backend parsers, all optional # Versions also need to be declared inside Read.pm ! # "Text::CSV" => 1.32, # "Text::CSV_PP" => 1.31, # "Text::CSV_XS" => 1.04, # "Spreadsheet::ReadSXC" => 0.20, # "Spreadsheet::ParseExcel" => 0.34, # "Spreadsheet::ParseExcel::FmtDefault" => 0, # "Spreadsheet::ParseXLSX" => 0.13, # "Spreadsheet::XLSX" => 0.13, # "Spreadsheet::Perl" => 0, # Not yet # For testing "Test::More" => 0.88, "Test::NoWarnings" => 0, # for ss2tk # "Tk" => 804.032, # "Tk::NoteBook" => 4.009, # "Tk::TableMatrix::Spreadsheet" => 1.2, }, macro => { TARFLAGS => "--format=ustar -c -v -f", }, ); $ExtUtils::MakeMaker::VERSION > 6.30 and $wm{LICENSE} = "perl"; my $rv = WriteMakefile (%wm); package MY; sub postamble { my $valgrind = join " ", qw( PERL_DESTRUCT_LEVEL=2 PERL_DL_NONLAZY=1 valgrind --suppressions=sandbox/perl.supp --leak-check=yes --leak-resolution=high --show-reachable=yes --num-callers=50 --log-fd=3 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES) 3>valgrind.log ); join "\n" => 'cover test_cover:', ' ccache -C', ' cover -test', '', 'leakcheck:', " $valgrind", ' -@tail -5 valgrind.log', '', 'leaktest:', q{ sandbox/leaktest $(FULLPERLRUN) "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)}, '', 'spellcheck:', ' pod-spell-check --aspell --ispell', '', 'checkmeta: spellcheck', ' perl sandbox/genMETA.pl -c', '', 'fixmeta: distmeta', ' perl sandbox/genMETA.pl', ' ls -l */META.yml', '', 'tgzdist: checkmeta fixmeta $(DISTVNAME).tar.gz distcheck', ' -@mv -f $(DISTVNAME).tar.gz $(DISTVNAME).tgz', ' -@cpants_lint.pl $(DISTVNAME).tgz', ' -@rm -f Debian_CPANTS.txt', ''; } # postamble 1; Spreadsheet-Read-0.63/CONTRIBUTING.md0000644000031300001440000000204412561052275017515 0ustar00merijnusers00000000000000# General I am always open to improvements and suggestions. Use [issues](https://github.com/Tux/Spreadsheet-Read/issues) # Style I will never accept pull request that do not strictly conform to my style, however you might hate it. You can read the reasoning behind my [preferences](http://tux.nl/style.html). I really do not care about mixed spaces and tabs in (leading) whitespace Perl::Tidy will help getting the code in shape, but as all software, it is not perfect. You can find my preferences for these in [.perltidy](https://github.com/Tux/Release-Checklist/blob/master/.perltidyrc) and [.perlcritic](https://github.com/Tux/Release-Checklist/blob/master/.perlcriticrc). # Requirements The minimum version required to use this module is stated in [Makefile.PL](./Makefile.PL). That does however not guarantee that it will work for all underlying parsers, as they might require newer perl versions. # New parsers I am all open to support new parsers. The closer the API is to that of Spreadsheet::ParseExcel, the easier it will be to support it. Spreadsheet-Read-0.63/files/0000755000031300001440000000000012606163731016366 5ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/merged.xlsx0000644000031300001440000002017012474016202020542 0ustar00merijnusers00000000000000PK!È£Í4vÝ[Content_Types].xml ¢Ù( ¬TÉnÂ0½Wê?D¾VÄÐCUU]Ž-ôLßT bˆ 4–TÙ4DÃŒqDl …œŒ?Øt4’™Šô®*f;+‰@{¥ì¡—ˆì®FùŸio{SúmAÌgâ`ñ2k? Ly²Ù–&`CwvÝ™|ù¸^z¿¾v*uÒJwÐ}®\¡Yô%®·¨­ACB$ÇÌÎqskïMmQ6§þ-<­Æ¿+֥РçÄ_Îêêõüݥ㸋ÜG¸|‡ÎÖÓg6 ›ØäÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!BE T,xl/workbook.xmlŒ‘ÍNÃ0„ïH¼ƒå;ÍMTª:•*@ô‚8”ölâMcÕ±#Û!íÛ³NH'{vío=ãÕúÜ(ò ÖI£Mf1% K#¤>2ú¾{¾[Pâ<ׂ+£Ñ 8º.noV½±§cNÚ1Z{ß.£È•54ÜÍL ;•± ÷(í1r­.\ à¥qœG —šŽ„¥ýÃT•,áÑ”]Ú Š{|¾«eëh±ª¤‚ýèˆð¶}å ¾û¬(QÜù'!=Fç(M ¶k7T¡›ÅŠ«É7K0Q»ZºÃ·{JT¼S~‡¶§©˜c:OÓ<BD{ ½ûIΩ…é½Ï1òËU¡è‡ÎA _3šÆù"›j/ µG|’-â@~á‡`q̰=¸Þ(.üÀù}áÞ.%nìë0Ý*¹*ƒK\†ƒéæÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!Ø‹&Õ^ xl/styles.xml¬TK‹Û0¾ú„î]%)]Úb{YX… IK¯K¶Uô0Ò8Øûë;²Û{*e{±æù曑³‡ÞvU!jïr¾¿Ûq¦\é¥vuΜï>rœãÊù "(Þ¾É"F¥„‹9oÛÏBIJQâo•#Oåƒ$5Ô"¶AŒ)ÉqØíî…íx‘UÞad¥ïÒ-fC‘ÅgvC–=EVzãC‚§‹ŒVMOê7üìØ \L¡Xm†ÉuH‘*ÌG$¿6f©wHõÈPd- ªàޤ°Y>-UsÔü3Æý%º0ì6 b,Xd$‘½ít2™QÒEƒ®›t¢oé{ñˆÞ’ 5ÔÞ!QÜ2fÚ)•1§4_Õ ì¾b®³G‹_dÎi´‰„›HÌâ„7) ‹6ao`ßYÿËújÁE6ƒ¶5ãѵ³ê¶*pSYãƒ~¦ÓÊ”äW§ÝF]& 1:N¤¯^ÕÁ»ÃÈ31»ß‹á-c`iÍs~Ÿ!É6Ù¥Óµ[¸]gG°²_·a—ZG¸Ð›M{²¢¥ª‚Îàyqæ|•¿)©;ûi‰ú®¯Gˆœ¯ò×´´ûû‘ÞõÇPüÿÿPK!¹/µ7 xl/worksheets/sheet1.xmlŒTMoÜ ½Wê@Ü»x¿šÖ²íÚŠšC¥ªÛöÎÚcÅ6ØÝ6¿¾ÄÎ&Ù(½Á›™÷Ã@rý§ïÈ´rHé|QC)+14)ýùãæÃ'JŒåCÅ;9@Jÿ‚¡×ÙûwÉIê;ÓX‚ ƒIik­Š3e =73©`ÀH-uÏ-nuÃŒÒÀ+_ÔwlEYÏÅ@C¬ÿ‡CÖµ(¡å¡‡Á ·èß´Bš%•À˜;ÑP§t3‹eYâ• 8™³5±|¿ƒJ 6€w°½”w.ñ¡OpŒ¼´â9t¯±7¿ƒÆÚ °Iá|=ªÝøV|Ó¤‚š:û]ž¾€hZ‹²ëÙ•gð·Y@Ö šÒsÅùT<£bþ(€F&ׯXX^´àPgaØàœoñÔSþ2cù4£x™ñЧÕEOõ·váH¡-ofäofà<¿®î.Ìb¥ *Ç÷!;KÀvõ ?ņ”ò0 ×Í„><œE¼Yºæ>÷ó¯q6pÆoà+× é FÊhvE‰î×V*â»ÙKke?îZüç:ša÷k)í¸AÇ»{PDqz'îñúL‰ÔÿðSª¤¶š KI‹ø½Ä@W(ŒÔýnV”{‹*¥ú¶òχMYöÿÿPK!90™áxä'xl/printerSettings/printerSettings1.binÊ`(`0c°`0a0```8É|3ê:/“ãIæ™ ‡™At#”Þ¥=¡ò'žËs132Üaà`®fd`dàd˜Ém‘d±McBf vš¯À`Ä`´¥H[2˜3ä!ÉîI`s" ö…¨ÿÿPK!;ssMmdocProps/core.xml ¢( |’QKÃ0…ßÿCÉ{›¤sNBÛÁ”áƒÁ‰â[Hî¶h“–$Úíß›¶[­L|Lι_ι$›ïu}uª29¢ AQIe¶9z^/ã9Ïäee Gph^\^d¢f¢²ðh«¬Wà¢@2މ:G;ïk†±;ÐÜ%Áa‚¸©¬æ>í×\|ð-à”k¬ÁsÉ=Ç-0®":"¥õ§-;€JÐ`¼Ã4¡øÇëÁj÷ç@§ŒœZùC:ãŽÙRôâàÞ;5›¦IšI#ä§øuõðÔU•iw%™LXྲÅ}²«ÞM´°a‘IíKîü*l|£@.gîsG`wUú@F!뫜”—ÉíÝz‰Š”ÐILÒ˜’52BÙôê­ ðk¾ Û_ècŒÿ‰Ó–˜ÎÖdÆÒFÒñ(2|öAŠoÿÿPK!:Àf‹‰docProps/app.xml ¢( œ’ÁnÛ0 †ïú†îœ`†@V±¥+zذIÛ3+Ó‰PY$ÖHöô£m¤q¶žªÉŸøõ‰”º9´®è0e|%æ³RèM¨­ßUâa{wýU™À×à‚ÇJ1‹}õI­Sˆ˜Èb.ØÂçJì‰âRÊlöØBž±ìYiBj8M;𯼠æµEOrQ–_$}õu|3£ã²£šÖÁô|ùq{Œ ¬Õ·5@üJýËšrh¨øq0è”œŠŠé6h^“¥£.•œ¦jcÀáŠu.£’為G臶›²V-;4R‘íÛBϱǩDÉ‚'ÆêÛÆdˆ]Ì”ô¦—g5z%¹a,á´wÛÏz>4ppÙØŒ ,\"n-9Ì¿›5$z‡x>%FÞç;óWNñ†óEÿX¯BÁYx‹~Zÿ’â6Üáiš—EµÙCšpÒÏuσL®7YíÁï°>õü/ô»?¸ž/f%Ÿaå§š’篬ÿÿÿPK-!È£Í4v[Content_Types].xmlPK-!µU0#õL „_rels/.relsPK-!>”—ôºpxl/_rels/workbook.xml.relsPK-!BE T,¤xl/workbook.xmlPK-!¨^«»% xl/sharedStrings.xmlPK-!;m2KÁB# xl/worksheets/_rels/sheet1.xml.relsPK-!iÀRŠV xl/theme/theme1.xmlPK-!Ø‹&Õ^ Ïxl/styles.xmlPK-!¹/µ7 Ïxl/worksheets/sheet1.xmlPK-!90™áxä'<xl/printerSettings/printerSettings1.binPK-!;ssMmùdocProps/core.xmlPK-!:Àf‹‰}docProps/app.xmlPK &<Spreadsheet-Read-0.63/files/empty.sxc0000644000031300001440000000000010313232324020215 0ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/misc.xlsx0000644000031300001440000001755511130422501020236 0ustar00merijnusers00000000000000PK!XVÆ`Ú[Content_Types].xml ¢Ö( Ì”MNÃ0…÷HÜ!ò%n‹„JÚ?Kè¢Àؓƪc[·´·g’ÐJ ©„›D‘5ï½ùfœ|±¯M²ƒ€ÚÙ‚M³ KÀJ§´]ìuõ”Þ²£°Jg¡`@¶˜_^䫃L¨ÚbÁªýç(+¨f΃¥“Ò…ZDú kî…܈5ðÙdrÃ¥³lLc£Áæù ZA²!>‹š|øÞðHjÐ=§é±ä¾+l¼ &¼7ZŠHÉùΪo®©+K-A9¹­É+kÅ®þ£!ƃm…>€PXÄÚdèÑùJ±51yÜzƒçµö 3£Ê¶}¬´Ç‡avÃLÞ]ؼ9·ùk* ¬Ús÷-MoœGN³ä TêIBÔpbÖçM ØôÞŽyûšÎðu5NúC zr\ÿ“ãoå/xœvBºçƒ8Þ¦ºgxû_›ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!»DÚðGxl/_rels/workbook.xml.rels ¢( ¼’ÍjÃ0„ï…¼ƒØ{¼¶Ó–"çR ¹–ô„½þ!¶$´Û¿}… nÁ½„\£E3«Ùí¿†^}PàÎY Y’‚"[ºª³†·ãËú ‹±•é% #1ì‹ÕÝî•z#ñ·g],khEü‘Ë–Éódã¤va0ehЛòd™BÝgI‰dοqáçtŠ¥éàOöÍK+d˜ÎÒ9MŠ›É/K8T¬•~ƒö®ì˜W6Ͳˆ Qltî÷Q(Éy'47]€b´—[5™QÒÅÑNp_çôy}ëÄ¡öQöXéÅ 6l$AT2ØÓÄñ$:ZU•øÑBÎkô2¦Ä.^ìšÇ÷C,³0 ‹†Àʘt2€N¢¦ˆE!%“%¦ޏ<›=f³ˆ¸þ0ÅÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!L£É‘„- xl/styles.xml¤’=kÃ0†÷BÿƒÐÞ( 4´Åvè(´PH ]åH¶ú0Ò9Øýõ=ÙŽcOºXïuî+Ù·F“‹ôA9›ÒÍjM‰´g'”-Súu:<Æ> v[Û˜ƒ7‘RœXlÂUb!£xƒùsÚÀþ7–´Å’ÄYÚ‹¤§çIœcJýVq/èD!y£4(»dö@¬ho]è÷xŽ+û3=„Ͳà†Óô3¥7ý!…jÌótëS]ôˆ”Þô{Öf×:L{žýÿÿPK!kÅ3q]Dxl/worksheets/sheet3.xmlŒQËjÃ0¼úB÷ZvJÛ¡4„öP(¥³b¯-[+¤MÒü}×v ½ô Ø—ffgóÅw߉„hÑ2KR)ÀUX[×òã}uu/E$íjÝ¡ƒB ÊEyy‘ï1l¢ Á.Òù¹R±2Ð똠ÇC¯‰ÓЪèèzüÔwj–¦·ª×ÖÉ aþƒMc+XbµíÁÑ ÓÄú£±>Ê2¯-÷†…D€¦™Te>Ò~ZØÇ_±¶X#n†Æs]ÈtUfWã¯AÔÐèmGo¸ÛbËfÉÝÍ™`©I—yÀ½àm2¶ÎëÁ›lž±®j(²š2ߕ׹Ú1SŧOœÓwoØj²ó5èhÒ%èàÙ‡èŽ÷X½náE‡Öº(:hXP:èaR7%„~T³F"ìÇÐð%€å¤ 7ˆtJsê­Æ¢ÐmÝ—%sd9yt¾ùÿÿPK!^é)2Cxl/worksheets/sheet2.xmlŒ‘MkÃ0 †ïƒýãû’´°F’2VÊvŒ}žÝDŽMËØêºþû)I[»ìfYzé•ÊÅwïÄÄdÑWr–R€o°µ¾«äûÛêâFŠDÊ·Ê¡‡Jî!ÉE}~Vî0n’ ÁŸ*iˆÂmž§Æ@¯R†(IÊh)Ûa0Æ>În¢$¦ŽåÙjºþûÉÉZzÜ!X²¬÷žž’/z#ðA£-d6K¥[a­m[È÷Í̓”­•A …Ò~j8„‹XÄ)¶ˆ»Xx® ™r{UÄŠV` £ÌÙˆï p“3âe|Bߌs¿zQC£ö†ÞððºíˆMžÏîoÏ’ÖŠT™{<ž?c§¢›Ù"c)U¼dýe>”Yž ÌTñǯOœS»ëx9¤+ækÐÒ4‰ £ãY\¡ýÛpduª…å[mƒ0а 4ê~R7%„nT³E"ìǰãÝËIgü¸A¤S˜Sm3^ etk¿4u,ÑÕè×ù)ÿÿPK!Ü×ô¦UgdocProps/core.xml ¢( |’ËNÃ0E÷HüCä}⸥/+I%Šº¢A v–=m#â‡lCÛ¿ÇIÚ ÄÒ3wÎÜ;r¶<Ê:úë*­rD’E ¸•Úåè¥\Çs9Ï”`µV£8´,no2n(מ¬6`}. $å(79Ú{o(ÆŽïA2—… Í­¶’ùð´;lÿ`;À£4b ž æn€±é‰èŒ¼GšO[·Á1Ô Ay‡IBðÖƒ•î϶3PÊÊŸLÈt¶;d Þ5{õÑU½ðp8$‡qk#ø'ømóøÜF+ÕÜŠ*2Á)·À¼¶Å¦âV;½õÑJ[£-óáØ(škÖÌùM8ü¶q*¢ ÿ.j¢Cƒˆ‚-Ú…¸t^Ç«‡r ²XLcBâѬ$cz7§döÞ켚olvyÞü1d]Ä)‰ÓII&”ÌéhH¼ŠÖ÷õ×(¾ÿÿPK!=ØàE=docProps/app.xml ¢( œ“AoÛ0 …ïú ݹé0 ¬bH;ô°a’vgV¦¡²$ˆ¬‘ì×O¶‘ÄézšOäãÃÃgšVwûÖ&²ÁWâfVн µõÛJßT bˆ 4–TÙ4DÃŒqDl …œŒ?Øt4’™Šô®*f;+‰@{¥ì¡—ˆì®FùŸio{SúmAÌgâ`ñ2k? Ly²Ù–&`CwvÝ™|ù¸^z¿¾v*uÒJwÐ}®\¡Yô%®·¨­ACB$ÇÌÎqskïMmQ6§þ-<­Æ¿+֥РçÄ_Îêêõüݥ㸋ÜG¸|‡ÎÖÓg6 ›ØäÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!bú´LGxl/workbook.xmlŒQËNÃ0¼#ñÖÞijJT5©„ ¢Ä¡´go«ŽÙiÿž«@¹qÚ§Ç3³«õ¹Uì ­“FÌb`¨+#¤>ð±{yÈ9ϵàÊh,à‚ÖåýÝj0öôỉ€v4ÞwË(rUƒ-w3Ó¡¦ImlË=•ö¹Î"®Aô­ŠÒ8^D-—®Kû Sײ©úµ¿‚XTÜ}×ÈÎA¹ª¥ÂýUã]÷Æ[â}VÀwþYH¢€9•fÀ? ÛwO½Tã4‹•?"ß-Xó^ùÉ›Ðɯtž¦as´b/qp¿Æ’R 3@Æ^¦|AÅú)|C8ygSïå±ñäY$¢ìàý"ÓAÚ†{Ü‘:Ôèí–ø'ÀìRRb·" ÓÊ«ŠÔŒ!,¦Ùcš…é å7ÿÿPK!÷Ò%áõ xl/sharedStrings.xmltÁjÃ0 †ïƒ½ƒðy­ÝF(ŽKi·Sƒm`b51$r)£}û¹”1(­é×§É®}?8rLTªÅÜ(@ªSˆÔ”êëómV(`ñ|—KuBVk÷ø`™2K\ªVdXiÍu‹½çy²rHcï%—c£yÑn¥ïôÒ˜ÝûH ê4‘”*›L¿'ÜþÕÎrtVœ)`35‘ÂjqVŸÛi±¼+ej‡õmêù.µOµïEòù ‰@ÚÈð¾½¶þhÓ(+aVU³SŽë}¢æ¬‡§œ ª*¸5µÃƒŸ:Ë«ÀÍëÿ"?ì~ÿÿPK!;m2KÁB#xl/worksheets/_rels/sheet1.xml.rels„ÁŠÂ0E÷þCx{“Ö… CS7"¸UçbúÚÛ—÷ý{³eÀååpÏå6›û<©f‘,Ôº…äch°ð{Ú-¿A±8êÜ -æÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!zÜÅü7 xl/styles.xmlÌWKÓ0¾#ñ,Ÿ4Ý7J²¤"¤­´Eâ°7vZ#?‚ã¬ÚýõŒí6–¦]„Úí!µÏ7ß<<'×K)Ð3×*Åñ»FLåšr5Oñ÷éäí%F•%Š¡KñŠUø:{ý*©ìJ°»c„ªR¼°¶|EU¾`’TïtÉ|)´‘ÄÂÔÌ£ª4ŒÐÊ IG£óH®p–¨ZN¤­P®keS|Ú¼BáË ä.ƸOš:.ð“’Rmz«Oú«¥¼(½œÔ‰Ó¾…åoî<‘i4 yÖ—”=NK´¶,K ­úºYR=¢"ÀºØ“"’…ù ³Ö|ÖvÑÇ©‡ á9ì¾h®…6ˆ+Ê–Ìyër^A$« í䉂 ø‚ÙmÞ6:‘wø Ñ$ÈĽȒ’XËŒšÀ­ÇÓU Ù¡ _ƒU~ÝŽÕsCVñø¬#y…Y2Ó†Âþؤf šÃ«,¬°Ãç ÷ou Ï™¶VKPNæZÃh#±TY’3!îÜúQô°—E'‰a7:ë]ö»!²¼0qø]´€Ý…½ÎÏÇEË¢QГŽÏ÷¡Õˆ#R–bõ­–3f&¾@v:G÷AÃîÞeìÔ ëƒàs%™«$.\d3E mø#8Ôm8<ìJŸå¹›Cô|ô—Å‹`æ¢ú”НP‡óQ>df›[|=¿Í¶p9Ž_öËž£¸i?jþ@=\ÿÜrƒéuô²»8vT‡Ù9°?ëÊò"4@/¥ˆuvÄ0½£‡v^§%ˆ·¶í)ù«Ö–ÝVð¥; Ãù8#°íuZ®Ó­ãÄ¡ìt™ø÷¾¥%é„=Iµöøâ…—a8\åýçð¹2÷¬ðmºQè?;Mn¯ÅmšU¤àº“â;¿$†â6%f5–«¦m;\€¥Ë¶g¹ŽÀ’\F]7Ý(‚¤¬ µ°ÓæcŠÛñWFy-¯šU·üA[‘âv|ãZ{èwUí7û ÿÿPK!sÙÓ 2xl/worksheets/sheet1.xml”U]oÚ0}Ÿ´ÿ`ù}$H "©Ú@µ>LšÖm}v‡XMìÌ6´Ý¯ßµ E/ûßs?î]^¿¶ ÚQ©˜à)BŒ(/DÉø&Å¿~Þ}¹ÂHiÂKÒNSüF¾Î>Z¾ù¬jJ5‚\¥¸Öº[*jÚ5å€TB¶DÃPnÕIJJ»¨m‚( ã %Œca!ÿ'†¨*VЕ(¶-åÚ‘´!òW5ëΖ%ÌB’V)¾/Ö ²¥UþÍè‹:øFš<=Іš–°cOB<â=L…QY‚‰H Ív4§M“â<½ùc5à¯pø½W»³[ñ]¢’VdÛèâå+e›ZƒìÌ,/D\øE-3‡QK^S<ƒœX©ëGá(Ž`Xl•í£›[e·Öꯈ&ÙRŠ; ATGÌùŒ°ÒˆMàŒ]/ þ1t³([î²É<ޝ–Á¼=~Ûãg yOˆÎEXõ„É9º'L1‚\Íqî²Ðg€-ï-ºÌ›¡xK"Õz¿u¸ÏüÏï?ÅWOÎáë^ÿÐØØ§pdlr™1CŒ%óa»œ1‡_õ‰½Ãs‡ÏÏá«>¾yæV¼ °î ‡Î†Í=r”K®£¡Îâdâ÷Ë9s¸¿K§xîð©?’“õ+‡ÏÎáë^þü]Bƒ·u‰1CcP\}àé‰7O1…åðÚÇ—I:HA8/5;‘ú€Sò(‰§¥gŠâÇÐS¼¿|ïØáãáÙ `ï€-ÂàoxwÁå媲«Š-•[½*Ä–ÃŽ˜Rægû†1[ÜÚ‚xêrWCÔ¬€^ ®]k@ú­ƒ®ÈE.xßEM9îȆ~#røB ­@&%pÒ•{7Т3òèIh¨æö³†þH¡‡# WBèý ù@õ¶Cé¨|`AxŽ‘ :¡m€)î„Ô’0 •æÿBž¤Yu,ÅÓh>ÇI4‡·*¬L±¼/mëpšwV ‘†mø#ÓuŸ½iæþùnŸýÿÿPK!ú" 'xl/printerSettings/printerSettings1.binìUÁrãDm'[Ø*È‘#7NPN6ÙâË–ãÍz-$/,U9ìÄÛÚŒ5ªÑ(ÄœòA¹ð/œ8rá–îÍH²·¨­‚*8`—4óº_÷ôt÷Œ®áRXÀ)œás — A ä}½GðÁ¯ðóãä‡^>‚ß?–G)ôàSxup€ã«ƒC|?ÿÔû:þ ^¯ÖÑx€Ã»&Q<ùö·þ®ôïãÏŒ‹ã/è@ý½>:{ìæ»ãa-x€c¸¾:„uðÈSzïØÁ/?}ry†´÷Ió6vT's£³të;Þ»GgE±5ñ9î‡nRoáíŽäøOgÀUÄù}}LçÏCt4Äóº€ sn%ž¯Ïë³ü%ŽçøÐøú( A«˜—RT:“9<í÷Ó"ƒQ8Nò—%‡ |[\η‡2·‚@Þq‘Êr*™kÚ³›d-µ7 ¤j*S²ñóá(D3t¡2£l¡F­×\}§#òMz»„1ÛlX‹ap—­eÙb´RÌót˜-h•ö>^XkœXa’m*ÁLÎFa¼2)8OÑUfj³JGJ.3AÙh@mUHm–§H¬2ª¶¸EŸ[Õ@ÜÎîŠ@+ºXe 7%¹ 2ù¢\Ír±+¶ ¦ß_¡U[C/¼·-!©nJ¯ëLS&+¥_k®XQdùÊ ©4àF1}”†D³B`#9˜–¢Òƒ,‡‹JË„ n 3Ù°¿Ù*÷L#z™g&ùbÍ)m¡iW Ö,=[.K®ŸÉâ6Àn(ªÐË(]ù7‚K)x»ïC¶àCùCN‹ÕSkn¢I6Rêµ` ²ÕZç¼,¡ßÿªßG#Cåk–/h÷mhýPÅZÐq|!Õ†‰o*&2½Ev ‹Œ7§Ék8²,/Ò7UÙzÎïõxyOjgè%f¥n%|Xaþï}ÌxêU,5çäë¾—Æ“h å­àoÂæÀ SplC"Q¨ìEQß$X;w•Ø]‘¢í>à9FI3ÍÒÔœ˜š(ŽçÑõK-ŒyZaF窢´NYŽ[ÞÙÙ”§3µ¼È·Ø3Øf‰ºÛg´Óf\ß/’ˆ¬(×¼µ{/I²9<çšRŠÝìˆ&)ô:§phå íGÜyŸ5Þ%R­Étzb lsоŒË\32Fìers²Ç;myBÊéáI—ðdpÖ%œíê]ºÈÎ;„KÎî¶­íX¼OiÅi(Ý@#ÁðR0ɤe ìøˆÛϰØRÌgÊ” ïOº inUØNØìS{(ê.ÅCÐDÑK‹*×vÆIÍ©]ZDN#¼«Ú}A8æ+:ÒØ*,Å®6û†ÿ—Ç n2 G§øüqþ ÿÿPK!ˆž O`docProps/core.xml ¢( |’AKÃ0†ï‚ÿ¡äÞ¦Ù¬n¡í`Êðà@°¢x É·-Ú¦!‰vû÷¦íV;¡—ä}óäÉGÓž*ƒ/0VÖ*C$ŠQŠ×Bªm†ž‹U8CuL VÖ 2t‹ùåEÊ5åµGSk0N‚ Zƒ‘ï*X?È¢vŒ%³ní'¾‘ –‡?Š­ƒë,0¿â¡ÚtˆRt´êP‘ YÔ¿ÓØ–,{†ˆ=NÉ:,%¬Þ6†ÚøHAþÂðòl F+x2ŒâPνóZ’‹ÁŠkc0‚¤Æ5b¥É`|l6èÄ‹9ñÀ0òŽ8÷@Xa¤w„ãÓ]¥¯]ëÁžåæéq½{ºË¾æû\ðI?´}‰;_¹>wîµ(¶GX§ÿ1õ/‚xHs ¦YÁ°ž<ïý*ìÇ}—‹e^¤oØ€Iü²ÙòÿÿPK-!È£Í4v[Content_Types].xmlPK-!µU0#õL „_rels/.relsPK-!>”—ôºpxl/_rels/workbook.xml.relsPK-!bú´LG¤xl/workbook.xmlPK-!÷Ò%áõ  xl/sharedStrings.xmlPK-!;m2KÁB#? xl/worksheets/_rels/sheet1.xml.relsPK-!iÀRŠVA xl/theme/theme1.xmlPK-!zÜÅü7 üxl/styles.xmlPK-!sÙÓ 2#xl/worksheets/sheet1.xmlPK-!ú" 'fxl/printerSettings/printerSettings1.binPK-!ˆž O`¿docProps/core.xmlPK-!SòÌ`–E docProps/app.xmlPK &#Spreadsheet-Read-0.63/files/test.xls0000644000031300001440000002000010313232324020051 0ustar00merijnusers00000000000000ÐÏࡱá;þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?þÿÿÿAþÿÿÿþÿÿÿDEFGHþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ » Ìá°Áâ\pH.Merijn Brand B°a=œ¯¼@=àZÏ?N*8X"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial#,##0\ "$";\-#,##0\ "$"!#,##0\ "$";[Red]\-#,##0\ "$""#,##0.00\ "$";\-#,##0.00\ "$"'"#,##0.00\ "$";[Red]\-#,##0.00\ "$";*6_-* #,##0\ "$"_-;\-* #,##0\ "$"_-;_-* "-"\ "$"_-;_-@_-8)3_-* #,##0\ _$_-;\-* #,##0\ _$_-;_-* "-"\ _$_-;_-@_-C,>_-* #,##0.00\ "$"_-;\-* #,##0.00\ "$"_-;_-* "-"??\ "$"_-;_-@_-@+;_-* #,##0.00\ _$_-;\-* #,##0.00\ _$_-;_-* "-"??\ _$_-;_-@_- ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ à õÿ øÀ ठÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ’â8ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÀÀÀ€€€™™ÿ™3fÿÿÌÌÿÿffÿ€€fÌÌÌÿ€ÿÿÿÿÿÿ€€€€€ÿÌÿÌÿÿÌÿÌÿÿ™™Ìÿÿ™ÌÌ™ÿÿÌ™3fÿ3ÌÌ™ÌÿÌÿ™ÿfff™–––3f3™f333™3™3f33™333`…™Sheet1…G Second SheetŒ®ëbðZð 3 ð¿ À@@ñ  ÷ü_A1B1D1A2B2A3C3D3A4B4C4xxxxxxxxÿ 0 » Ì dü©ñÒMbP?*+_‚%ÿ€Á$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333é?'333333é?(333333é?)333333é?¡"d‚,,é“>é“>¹?é“>é“>¹?U} ÿ¯ ý ý ý ý ý ý ý ý ý ý  ý  ìPðHðð0ð( ð ð>¶@ » Ì dü©ñÒMbP?*+_‚%ÿ€Á$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333é?'333333é?(333333é?)333333é?¡"d,,é“>é“>¹?é“>é“>¹?U} ÿ¯ ý  ý  ý  ý ý ý ý ý åìÈðÈ ðð°ð( ð ððx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 1<ìxðx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 2 Note 2 Note 2<ìxðx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 3 Note 3<HMBHMBHMB>¶@ þÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0  p x „ œ ¨´Ìäðüéý4@1Ÿ±@0:é@x¯ÎæVÅ@GæVÅH.Merijn BrandH.Merijn BrandRoot EntryÿÿÿÿÿÿÿÿÀF0PdøêÅÅ@WorkbookÿÿÿÿÇCompObjÿÿÿÿÿÿÿÿ@IOle ÿÿÿÿÿÿÿÿÿÿÿÿB_SX_DB_CURÿÿÿÿÿÿÿÿþÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿCPÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.63/files/test_x.txt0000644000031300001440000000005011275744471020437 0ustar00merijnusers00000000000000A1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.63/files/perc.xls0000644000031300001440000003300011131150660020030 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ FÍÉÀá°Áâ\pH.Merijn Brand B°aÀ=œ¯¼=àxŒUn78X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1 ÿArial "â?¬"#,##0_);\("â?¬"#,##0\)% "â?¬"#,##0_);[Red]\("â?¬"#,##0\)&!"â?¬"#,##0.00_);\("â?¬"#,##0.00\)+&"â?¬"#,##0.00_);[Red]\("â?¬"#,##0.00\)=*8_("â?¬"* #,##0_);_("â?¬"* \(#,##0\);_("â?¬"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)E,@_("â?¬"* #,##0.00_);_("â?¬"* \(#,##0.00\);_("â?¬"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) ¤"€"#,##0_);\("€"#,##0\)%¥ "€"#,##0_);[Red]\("€"#,##0\)&¦!"€"#,##0.00_);\("€"#,##0.00\)+§&"€"#,##0.00_);[Red]\("€"#,##0.00\)=¨8_("€"* #,##0_);_("€"* \(#,##0\);_("€"* "-"_);_(@_)E©@_("€"* #,##0.00_);_("€"* \(#,##0.00\);_("€"* "-"??_);_(@_) ª0.0% «0.000%àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à©õÿ øÀ à¨õÿ øÀ à õÿ øÀ à A À à«A À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… <Blad1ŒÁÁTüÿcc FÍÉÀ ø‚  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} I ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿ½@@$@$@½y@@@½i@@@½Y@ð?ð?½D@D@D@½4@4@4@½$@$@$@½@@@½@@@½ ð?ð?ð?~ D@ ü©ñÒMbp? ü©ñÒMbp?~ 4@ ü©ñÒMb`? ü©ñÒMb`?~ $@ ü©ñÒMbP? ü©ñÒMbP?~ @ -Cëâ6:? -Cëâ6:?~ @-Cëâ6*?-Cëâ6*?~ ð?-Cëâ6?-Cëâ6?ü©ñÒMbp?ñh㈵ø?ñh㈵ø?ü©ñÒMb`?ñh㈵øô>ñh㈵øô>ü©ñÒMbP?ñh㈵øä>ñh㈵øä>×*bh22222266>¶@ï7 þÿ à…ŸòùOh«‘+'³Ù0¨@HXp ˆ ” ämerijnH.Merijn BrandMicrosoft Excel@€x2ü¤mÉ@xápÉþÿ ÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ªä PROCURA B.V.WoA Blad1  Worksheetsþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.63/files/macosx.csv0000644000031300001440000000164311123134730020367 0ustar00merijnusers00000000000000"'\'\\'\\\'""\""\\""\\\""",,,,,,,,,,,,,, Exported 12/16/2008 10:30 AM,,,,,,Category,Category name,,,,,Category name 2,, Username,Last Name,First Name M.,Section/Group,Status,Notes,Assignment,Category name 1,Category name 2,Category name 3,woot!,dqwdqwd,Category name 2 1,Total Score,Class Grade ,,,,,,Grading scale,Points,Points,Points,Points,Points,Points,, ,,,,,,Points possible,11,11,11,11,11,11,, dcwalker,,,,Dropped,,,1,34,1,,,,109, jdr99,,,devs,Active,"qwd qwd qwd",,12,0,1,,,,39, jlaney,,,devs,Active,,,,2,23,,,,114, mcrawfor,,,devs,Active,"line 1 line 2 line 3 XX fwe and so on yea!",,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,Mean,6.5,12.0,8.33,#DIV/0!,#DIV/0!,#DIV/0!,87.33, ,,,,,,Median,6.5,2.0,1.0,#NUM!,#NUM!,#NUM!,109.0, ,,,,,,Mode,#N/A,#N/A,1.0,#N/A,#N/A,#N/A,#N/A, ,,,,,,Min,1.0,0.0,1.0,0.0,0.0,0.0,39.0, ,,,,,,Max,12.0,34.0,23.0,0.0,0.0,0.0,114.0, ,,,,,,Std. Dev.,7.78,19.08,12.7,#DIV/0!,#DIV/0!,#DIV/0!,41.93,Spreadsheet-Read-0.63/files/empty.ods0000644000031300001440000001315510327656236020245 0ustar00merijnusers00000000000000PK½TZ3…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK½TZ3Configurations2/PK½TZ3 Pictures/PK½TZ3 content.xml¥VMs›0½÷W0z“Ûi›PÛ™étzJNi;½Êb1šèƒ‘„qþ}%„±pŒÃ´2^½·ûöiY²z8žìA¦ä:ÏnÒ$U9“»uúëçt—>l>¬TQ0 Y®h-@ZD•´îoâØÒdátÖZfŠf2I˜ÌÒLU ¬,Fgm­1ö•O¦·à˜má`§’=vÀ%Ûé•[pÌÎ5i¦’=Ö™Ó 5•|0ʹ.*bÙ™Šgòe–ÖVÆMÓÌšåLéžßßßãö´L{\UkÞ¢rŠƒ/fð|6ÇG¬K¦êóØX’¬Åôdkˆ%onÕìw“'b¿±†–DOž<¼Þe>ýz—yÌÄ–#wr‡ŸÜaûxz<Í‚SkyìÀ*ªY5¹Í€ŽùJ©^ª'„´•»¸¹¹Åáw„n®ÂÍ,èN¯Â)á´w\‰K¦9Ü;‚½Ó~ð½f„°Àḛ|4õŸ§ÇgZ‚ '0{Œ˜4–HïL·Ò{ts\šÁpƒû@á–'*”åf³ Ã߇“ðÛ_â:ýƬ±ˆH~ƒ&É3‘fž&näxÁøë:ýH*e¾^‡ƒ4‰jTÌR7œ{¢™ßh)¾®à')•·æMÍþàŸS_ÐûŸ½ÚÍÜà™†óžDƒ^rÍDÃJcð“½0þtµ §…ßa9/뵯܃¾Ý™ð›RÑÌçD!JR§Ï€k–a&vÉ)É& ’é¡ÕŠO šd3FÍÿ~ëÓbCäBÖ©5O0kÉY;}bõ:÷\\~ÁH‰úk3Óä …˜‚’×B·«œ<:åWi2á*0 /GTâ'Ú P~RºõS„yn²ýµYB>ëVy])*s¾.˜ £ñQ걄RÁÒW?€z¥Ý¿†N†gÃKó¨“f’ý©¦ÒÝ”¢#¯UïLUû#˜¡Ozªÿƒ’g FE N!ÙÁáN}°·–sÑ;‹—.Ž»&¯VW1L7f‰v(Îa=ê/ ‹>[}àJé™}½º²R8íPãÉ?ï$ÌrCûÞ„ƒ<¸õÿ'pzã‹LgV77eé™Bî]DæcÊì[¡hß8!”~Ò½”e®v_¤‘þi¹é  Sx#ƒs~óIôm²õtB‡“5ªÙ(‘lUÈÓHdµ¦¹¡¥{†¥ÍzŸÜ™÷oUóWî0¶àäþþþ.<_lVª3ήcèz4‘0]ÎRÓZ«Ò OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-10-26T12:37:22H.Merijn Brand2005-10-26T12:37:57en-US2PT35SPK½TZ3Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Òå@¼€ƒ Hš1}–e``l÷tq ©˜óö¢#'ƒÏ¶¯î-Oâ94·É!­œß÷³uCù^có3w Š2hÅxÃäãÌZwôÖšûÀ˜aðtõsYç”ÐPK-šöüjÀPK½TZ3 settings.xmlí™[SâJ€ßϯ°òzJ¹ê1”²² x[•·IÒ’ÑÉLjfB€_¿"[š%.†ðp¶äÈ\¾îôôt÷$gßæ>9˜˜Ñs­rTÖ€:ÌÅtz®†—‡§Ú·æ?gìé ;Ðp™ú@å¡)Õq ¦SÑHºÏµÓC‹E>ˆ†t,ºžÖx;º±–´Ì ¦/çš'eÐ(•¢(:ŠjGŒOK]×K«ÞõP‡Ñ'<ÝVT2ú­(ÆØ/Añ„D™•°j¹\/%×ÚÁ«’ïLÓ\Ûa}ûͳWÉÏ!–àǶ9xmŽU;×”ÈÆ CôËjÚ¦yï猱À6ƒ²@[wÊE :1•Z³|Vúò)ð <Éýï±+½MèjõøtgzðÔÛ¨yý¸²-ýÐGÁ!¦.ÌÁMK‚hó­æ(çâ‹mô…¨ë¦”’«õךqçç4¡)=‡HÙãOоŸ2ðde ÷3C.ï1¥òþ‡½ä=ù±@r‡q¼dT"2–·Ì…´ù=Æwðoà;û¢§´_¨ÈýùVÿ=ð Gâ¬è¢Ó óTóÁ×ú³ÖX++¢ìÈ-6v¯©-&%ó?ÞÐø6–eu¯‚ζ ¿ Gñ.‰;;o ‡3BlijÓË9-;aÌ*N¡[:†Ž ÓÔ•ª•r^'@SˆóLJô“œðÇ¢X@K¥Ù—‡¸lIñmÆ ª5Ÿ_Ì8[é/²HîÀ¿cr_è6ÇéÌ^9¦šŒ0žBo¡Jõ¤¦ª§“ÖuVé ¡T}j±¨ÈUUó^„¬‰Š4{ wÅPª“ ¾Íˆ@:!"d@Q0dÒ ]ÄÎJÀ]ñZ.ïM‚B­wfqXÉ‰Óøâ®øAh»x†E¦úÁ7+Ÿ×u¼1Çb° ŽÇÅKȈrV¯‡¥ÍÔÑvûÃpÒr/ðgNÅ_yã/Ë7˜¾ŒIÈ>PÕ¾RÒWJúJIuJú“$#”ÌDÄ ‰ Åã{ꘪîãN]dœ`ç*ëÌw‚«Í¦ØHÀI½…)â ­iEK58¾^7þŸ~eÜ-ƒúäáj½7Œ[㹟\”J§-Ãðêï…«¾¾Ž­öeùq`ÌMÚZ ûãòä¡«C{¼°kÓk»vLTÛãƒØÕº>jë ·s塇þõcUÐýxÙ^\;Õ;ÏnôÛ¡™~Ås|7°}ËCt¼tÛbÓ¾~kFÑÍwCÜÁ³]Ïß"NÇb½a·¬d/íö¸:¹ô·ý®Ož'Ãrd’Vߺ¸›ÙÔ"paynûâ:§;YŒðïH¢âÝÙôGŽò9“ùïûŸntÅ5pjŒh/¤Ž ц牅<,@3'¯a~P“0±’!—œùCðƒ¢ÌB BT9‡ƒ+f›ˆ:@öPR1äZªÞa”,rÜCfq_úíÝW)ë­`ó'PKªéÉpMWPK½TZ3META-INF/manifest.xml­“ÍnÂ0„ï<…ë{ì¶§Ê" ¨T©-¡G7ÙKŽy×Þ¾)@E.”Üü3úfg¤Owµe[ðh—ò'ñȸ¼)Œ«R¾ÎÞ’>ŒÆóå,û^-X­)Iu¶Z¿~¼ÏO¤\¶à–eir¯¤œgsöÙé"[ÊÅg¼{<¯™q(‡§kʃwªÑhP9]*ÊU½Š&58Rõêc2bgpi,$Qè÷ 0:¡} )×mkM®)– ·®G/qi!°õ  Ü?CÊ`mÒjÚ¤\ry—''bŒÈWš*øãg¿ÛìR‚Ï·š÷CW&§ào¥ìHÆÙû©1 <†ä"í-ààØHÿÚË6¡þqÚX”ÔE몡áà DqÿOÕŽåÕ†N~PKƒÐƒ¸99PK½TZ3…l9Š..mimetypePK½TZ3TConfigurations2/PK½TZ3 ‚Pictures/PK½TZ3ûâ¢Êø¨ ©content.xmlPK½TZ3¦u_Ùb  Ústyles.xmlPK½TZ3“ûõõt meta.xmlPK½TZ3-šöüjÀ Thumbnails/thumbnail.pngPK½TZ3ªéÉpMW ?settings.xmlPK½TZ3ƒÐƒ¸99ÆMETA-INF/manifest.xmlPK BSpreadsheet-Read-0.63/files/attr.xlsx0000644000031300001440000003274412565655372020305 0ustar00merijnusers00000000000000PK!sA³ŽœÖ[Content_Types].xml ¢Ò( ÌUËnÂ0¼Wê?D¾VÄ@«ªª8ôql‘ `â…X$¶å](ü}7á¡¶ ‡^%±gfgÇ›¤¿,‹h³©èÄmÍœ6všŠÑkëADHÊjU8 ©XŠ~ïú*­<`Ä»-¦"'òRb–C©0v,™¸P*âÇ0•^e35Ùm·ïeæ,¥U¢—<ÃDÍ Š^–üz­dl¬ˆžÖë*ªT(ï “)b¡raõ/’–›LLÚeó’¡cô”Æ€Ê"öÁ0c†Bö’w.: Ñ@zS%3Èe!‰+€õµs DÔ`7ÊaB¤Uؘêg½kÐ-ó{x^i›Ƽ³îæÆã†ãÞ÷äÓ…ÙØ¹Ù¥]©Ò—ÊØ­î!¨øëè ¬ow²Ã?¦ƒ£<Σäà7æ‡êdiÐ-ÏÈÀ®w'zÐm¬ágDOò€änݦ·ÿDGóéð7?0Wôx¢M/>6¾cŸ”ÍÌ8¿!ÛYRíÞ“HYÿ[z_ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK![¸Éaxl/_rels/workbook.xml.rels ¢( ¼”ËjÃ0E÷…þƒ˜}-ÛIÓR"gS Ù¶é{ü ¶d4Ó‡ÿ¾ÂMå‚»1ÝfÝ{¸Œ´Ý}v­xGG5 ’(&·Ec*¯‡§›{ÄÚºµ H°Ë®¯¶ÏØjö—¨nz^Å‚š¹’ò;M‘íÑøIi]§Ù—®’½ÎºB™ÆñFºßiŠ}¡À틈ÃÐ{翵mY69>Úü­CÃ,ä‡uGªÙ‹jW!+-’ãdyb—aî–„¡Z;,^Øù¬i:kÏÁ¤K„&Ð:%“ÎÁ$ÿ “ÌÁl–„!Z¿ôaa¾ë9ûÛ%íÙ?%œÜÇRŽçlë%Â&L¡uZŽõO òìcȾÿÿPK!Y|{°xl/workbook.xmlŒRMoÂ0 ½OÚˆr-…„(h_h\¦œCãÒˆ4©’”¿Ÿ“ Öí´SbûùÙï%óå¹’äÆ ­2:Ä”€Ê5êѯÍêá‘ë˜âLj½€¥ËÅýÝ¼Õæ¸×úH@ÙŒ–ÎÕ³(²y ³]ƒÂJ¡MņæÙÚã¶p•Œ’8žDŠv 3ó]"‡W7(בÌáú¶µ¥‹y!$l;E„Õõ«pﳤD2ëÞ¸pÀ3:ÆP·ð+ašú¹ÒWÓxJ£ÅMä§! ÖH·AyWvô+'ÉÄ#½[­ýiò!9ï„âºõP´ör¦)%m¨ìw%–§Ã]îÄ¡t˜ŒG²Ü‰lØ3~VÔìÄ¡á$*h}ÑR7ÆâÃy¯×¨gH‰™ ¼˜5}ø*¼QÞÜЉØG?IqPÞü^CÒkýmXiåú»ŒzàqèQCÎdŽNû#,¤Ó$ ˆëg[|ÿÿPK!rKËŒ xl/worksheets/sheet4.xmlœ—[oœ:…ß+õ?X¼—‹™[FÃT Ó>Tªz}vÁ3XLÁÉ´çןm°ìˆQÒ—âÏËÛ‹ÙÙ½ýS•è‘¶ãuä®ï Zg(t´¤™”D†GÓ²Œœ$wºß½¨¼Iïª9½ÖúiøO-Êé‰<”â3¿¼§ì\p»ë¥TÈx 8üD“OÀAùÓ–‹®îÜuàß…€£Ÿ´)“Ë”=t‚W?¤¤¬D`T"»›år±Ú¼@%T*0jßÅ›e°\áçײP*0j•Ð]àåz¼@öëmQ©üƒ-+%£ ÜåÚ_RÉZ‰À¨DÂÕ³Ïã O»MBÙïZ~A|xž]CäklAY&‡.Ñóï€ßÉt?î×;ïâ–©¹{¹ú`ΕÁØ„bS!šP¢!(aTZ˜ÐAAr1BKJ5t7…V&tTPh>žÎs®A–o;ÀµœÀÚé^®¶-²¡XA†E6”hhj‘ dXdC©†¦ÙÐQA†EȰÈ‹Ö×ÉYi|ÃFŸF³û˜Ýk^‘Y(VPµÍB‰†àïÇ,tP†Ã,”*(¼UøQC3…>ÁnO|Âîø®ÉyéÄs¬jcf÷^CF,(VPÕÍ*%2r`)$?™³J©‚Â[…54S¸áìöÄ©Å5QrVúdäàÎòICF,(VPµ§³ DAØÈ4däÀ‚R…· ?jh¦pÃ'Øí‰OÓDÉyéÔ4Ø·œÒÐ46+(€ê®NÙP¢ <Í 44Í ¥ o~ÔÐLá†S°ÛM§ä¼tjšXN)H¶c£ kª›…áiìíš&Á†R…· ‡6´?Ýb¦ðÁ©¡§Úƒ¦€®[° zȯÅП"ñ·V¼æ1¯Uë.Û¿†œéGÒžYÝ¡’žàоì1Q;tœÃà Ø $Ð=ö—4åz >° úFi~¡â¡A ihû…ýÃsæ-ƒö»ïº#§á­h °Õ–å‘Ó~ÈYÐ œöŠˆ”ì\ÿ`¢P%ÊFïúÄþÿÿPK!Ä,ÂB#xl/worksheets/_rels/sheet4.xml.rels„ÁjÃ0Dï…üƒØ{$;‡PŠ%_J!×&ýE^Û¢öJh·%ùûèØ„BŽÃcÞ0]Yõ‹…c" ­n@!…4Dš,|>¶¯ X< ~I„®ÈлÍK÷‰‹—Zâ9fVÕBlaÉoÆp˜qõ¬SFªdLeõRc™LöáÛOhvM³7å¯ÜS å0´ N×\—Ÿ»Ó8Æ€ï)ü¬HòÏ„É%’`9¢H=ÈUíË„bAëGö˜wú ŒëÌÝswÿÿPK!;m2KÁB#xl/worksheets/_rels/sheet1.xml.rels„ÁŠÂ0E÷þCx{“Ö… CS7"¸UçbúÚÛ—÷ý{³eÀååpÏå6›û<©f‘,Ôº…äch°ð{Ú-¿A±8êÜ -æÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!ìÅ ùWxl/worksheets/sheet2.xmlŒVMoÛ0 ½Øt_ü;Iƒ$E›¶Ø†}õ¬Úr,Ô–¥£îÑ÷€·G3(wÜ—ÂÞ‰;˃g ×Þ¢îý¨ ½ºº·.h>SŠNÏãE%C׸G¹{â:¾k—5o7v>h’©­„œc·é­n&ݰ°³âÔ~4Eú-M Ó׈ ÆF¡¤qc‰˜×F²Tk%»ŽÍ¿aþ•µ!5©xq¬Ö ÷aT¢äI˜vYÂpæÐÓÀ ¥ÌÛpº½k$¬ù(LÙ©àˆÄ[ÓÿK°ú ÿÿPK!ÌÌøä‹Zxl/worksheets/sheet3.xml¤•Qo›0Çß'í;X~_€¤mJTMÒh{˜TMÛúì‚«`3ì$í·ß»ÄxŠV)}h þÝÿîïsÎÉÝkÛ í%<ÅÑ,Ĉò\ŒW)þõs÷å#©/H#8Mñ•ø.ûü)9ŠþEÖ”* \¦¸Vª[ÌkÚ9å°Rо% ^û*]OI1µM0Û %Œc£°ê?¢!Ê’åt+ò}K¹2"=mˆ‚úeÍ:‰³¤`°¦ ¡ž–)¾V×8È’!óoFÒyFÚȳ/zá[‘â$mh®%ÝЦI1¨ ùgÐ4‚Á¨˜%§çwõÝ`ý±G-ɾQ?Äñ+eU­`Ÿç³åPR.Àá?j™ÞŒZòšbHtd…ªá›p¶ŒÂx8Ê÷R‰öÉ.hG‰ÊØE²¤G B²#º-Ñ "uÎy8‹B÷£8VÎs}K¡÷ò-“à 3Ùµµ–Nñ­‹ÄSdc‘¹£…Sfk™…ËDSæÁ0ñË\L^GÃëÃ:L]¹™æc¦aSÖ–í÷Æ7n‘IÁ¾qË,™È7n˜xœ1x‰qÆáW>šò[µ¶Lì0¾qƒÄ0=ÎÊl-㜌[fRÎãЫKŒOZ½ðZ­µÿsÆ-:ïØ2`êÄø­6̇Î8œ¼KëðÇ“Š¯<ã–q+ö[m¨ûdÊ?ã–ã·Œ{ª"¿Õf¨šÉÖÕp)–Ã@-WfT#õÖÁ­ÄÅFp{‹é¹Ø‘Š~'}ŸD -¡£°7ã×¼(Ñ ƒòY(«Ãc ÷…Î.…Pï/ iÖv׈4¬âOLÕ6‹¾6ô<oÅì/ÿÿPK!%ª‹Ô‹xl/worksheets/sheet1.xmlŒ×[›FÀñ÷JýhÞ»˜{Ö2Žb0—‡JUÓ¤ÏÄÛ(˜¡0»ÛôÓ÷ ‡àéú´öøçü½¾Ìîýß÷Æz•ýP«6ÎÓFX²=©sÝ^cñéì—wÂtÕž«Fµ2ßä Þïþi÷¦ú¯ÃMJmÁ„vˆÅMënkÛÃé&ïÕð¤:ÙÂ#Õß+ wû«=t½¬Îã“îín6¡}¯êVà„mÿf¨Ë¥>ÉT^î²Õ8¤—M¥áü‡[Ý b¿;×𘹠«——X|p¶å³°÷»ñÈŸkù6Û–¹/J}5”çXl` y2#­ þ¼ÊD6M,²Zü5΄›0О'ÒÛß§gã¥ÿÖ[gy©^ý»z+d}½ièì>Eã„q@Zéj¿ëÕ› 8FW™ ÎöNåd?À*<Í\Üë>ÚÙ¯p¼ÓôØÁ<#ÏDl–"AáÀK9q–$EâF„¸KrDâ…„xK’!ñ¡Ó| Ir$OH°$’Ð#$\’Iäòn&6¤œ{YéiVÇÖóy²f‡IÀûáG$™È”O‘¸´<;ЉGË3’!ñiyFr$-ÏH$¤å)‘D´üƒ,²YÉjVcSæfìÿì€Â×ïG$™†ÐòlJ:Zž‘#–g$CâÓòŒäHZž‘IHË3R"‰hùYd²’լƦÌÍØ{ó€Â¡åI¸´<#étZž‘ãDhyF2$>-ÏHŽ$ å)„´<#%ø ]ë²È d%«YL™³²Ï³ ‡–g$AâÒòŒ¤HÒP8´<# —–g$EâÑòŒ‘ø´<#’€–g$GÒòŒH"Zž؇ŒYhùÁ¬¸©À=AwƒM—®O°‰¸¨VãöÄÒß:؉µ*Qí´s3›‘®ºÊ_«þZ·ƒÕÈ tߘM†Õã–ïhÕ?{¿(­Õ}¼yƒ=™„=Ææ ðE)ýýÎ4ó£Ô/ÕUì?ÖÿÀáT_ÃîkÜtÅ¢S½î«Zá¶õ9}yvÌ áàlœhUM}mÿ¬õm:E³Ï2;¨y¹ÿÿÿPK!È;Á;‚Bxl/sharedStrings.xmll”ÏnÛ0 Æïö‚î­“ȺÂqÑfØvÈ.kûŠÍØl%Ò“¨eyû) z‘tÔïûøG4åö៳ê/ø€Lk½¼^hÔó€4®õëË÷«;­‚Œe‚µ>BÐÝçOm¢R,…µžDæû¦ ý΄kž’²g£›0{0C˜ÄÙæf±X5Î iÕs$IuW_´Š„"l.äö«îÚ€]+‡¡m¤k›Óñ‚F@9ÜÙ9;L(<‚µ|È­ÇIª‰ÏJ-»‰ÂyšÑ›cÎ,ì%g‡Á­ùS¹UxÎÑŽEØåô-Á}Q~ÖæÖG¦Õ+aZP¿žó -ˆ€W?X&ìk¢?IËõôR¨±ÇÁ¨ SàòÚÛ‹úl(|”ÏìØk€blÙÈÉ©êR¤¼E*æ¾R3#“_ÞÕ¹?–[Érÿ^ò)}êr]·&½ _îáϳ»¦œ#6iyóÙôl£+ÞÃ%QÝ«¾åƒª÷ù›jy«*z“þÝÿÿPK!ñ¬aXÞ©L xl/styles.xmlÄœÙnÛF†ï ôè…a›Ú,'$75à @R°ô€A‰#‰-•¤ )—}ž>UŸ¤g†ZŽ.cþ¦€À¡$Î7‡óŸŸä gØ»]øžñ"¢Ø ƒ¾Ù¼j˜†F¡ã“¾ùíñþòiĉ8¶¢o.ElÞ~ü¡'KOFmeûeIH³eüúX3¹ŽmÜ…Az¢2çÁâu3íÃ;¤VÔ;}–XW^J£<š¦NE(­rYšz•`éiæjkVXBK³<š¦fE(ÍrYšš•`éi&“ züR]ª”–vEDMýÊàt4,äiêX’§§å\Û…%´4Ì£iêW„ÒÑ.—¥©[ –žfëk\×$ñ¶×ðã¶ËÛYK© ¦H9}²0šÒäc^§JóŽ,G÷~•.û¤W s óe8¯”&ƒSVu÷Óݵëy›N?u Óo½™-{úÙXm?.gÔåhB iÉ’…{O"{Ùl]—/@·Ç®#£˜Üë´÷¿¦  ·lhÙ5©®l-5©{õ:jRÝÞ:*jª¾U-5©.r5¥ç:jJ»Ó:5)’‡aäÐâzø®IJ¿ô<1NÈ#‘;™Êÿ“pF‡a’„>m8®= Û£Mk]bµAØ‘ð¼9ÎøÇx‡½³A8±”}i9B(7é¼°ÚLyéÉ純ͱ×7´>ØXŒ75d•nf†µ)mس™·¼§ã 2yNÉbµ€¬6%‡f7½þ1ÊAUKޝ¢XrÅ’ƒ³(K{JžöûmO5äËÕÖ*WW™[Lf™ &³<“YVƒÉ,ÇÁd–ñ`2Ë0™¹LfÞ 4y£€UÁ`2ó˜Ì¼&3o€ÉÌ`2ó˜Ì¼&3o˜0o°*xL¦æ\_ƒÁd½™y3ó˜Ì¼&3o€ÉÌÔä0o°*xLfÞ“I¨µ7Àd½™y3ó˜Ì¼&3oPÃÀ¼QÀªà 0™yLfÞ“™7Àd­]&3o€ÉÌ`2ó…óF«‚7Àdæ 0™yLfÞ“™7Àd­]&3o€ÉÌT ̬ Þ“™7Àdæ 0™yLfÞ“™7Àd­]&3o¼z£€UÁ`2ó˜Ì¼&3o€ÉÌ`2ó˜Ì¼&3oÐfÎuã£çN_¤Ñ={ýј†‘û’]Na—$ÕSûÅ8û1¶Ê…$¢š+UO\k¨“$îH¶,=Û­¡¾-åò•“E°’ö¤1¤J×¶ÙO’ßÊÇì OÄ¡ü' ã j‹b›ÎãÄ/O|8M‡ipš8òà4aÈ{äšó@UÉÎõ_‹ö#¨Í‚ü‚¸DYýéŽM=2sj ɪË3E‰æqalBJþÍ_‰ÉSMš\€;LÖe©ë¥T‡±ŽIuë‹T‡±îGuëqT‡!Тp`yÖB: …tÍ&Ò4çÒ-¤ZH´h#ÐF: t@é€6Òm¤ÚH´‘h#ÐF:€¦íãNA¤:Htè ÐA: ƒt@é€ÒʹE]„UG¢ÜMÐïs(¢{õ¢˜cÓÓ›])%ž*³ O•™‚¦ªJ4TõÓàÐ7IyúCGªr mv¥·ñTir4U^ t™_£0£$}Y-˜šm>^8úK¾ßG½çÅ‚<\)U›1uGÈ—W!†œrÆ5J\Ы•N—Ò”zˆµ7¸¤Ö¶Ñj6¶dngÁÜfé›!¦÷ÍõF/;rÌíðÎpîz‰lV³m×ËÖYlWà){H¯ÿ’kó6Qû8blϽäqócßÜnŽ;÷é ³Úë«û& Ñ7·ÛŸåBÁ¦ZDomß16øÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!ˆ\ÓÒ 'xl/printerSettings/printerSettings1.binª`He(bÈg¨` 0²0±Þa8ÂüŸ‘“a· G ÅÏÁÄÈÀ$™€u^§w÷Å åm–1¹ŽÉ¬ 6›32{oמͷÆúBu\þ/‘Îc²ˆ'´ ×,@)O€¼ó}þòoÿÿPK!èýò^¨qdocProps/app.xml ¢( œ“ÍnÛ0„ïúïÃ( ƒbà(1rh#þ陡V6Š$ȵ`÷éKIP,µ>U§Ý™Åà—dçZ' ø ¬ÉÉ}š‘Œ´¥2‡œì¶«»ï$ (L)´5“ òÀ¿~akoxT’aBNŽˆnAiG¨EH£m¢SY_ Œ­?P[UJ“•§ ÒY–}£pF0%”wî3ô‰‹ÿ7´´²å ûíÅE`ΖÎi%Æ¿ä?•ô6Ø “ç³ÍèØd‘nòä^xÆè¸e)41˜WB`ô*°í¡­…ò³ H´> êw<¶IÞE€''ðJŒXíXßtµv=ÿþã]‹ £q »r<;®ÕœÏ»XLÛ€$SÄ­B áµZ 7ˆçc⎡çíq «íɇ1à'êªÛøMk©ÕÁ´»¿é®¬ÁIä„þ/ÞÂÖN˜ _¿½»·eò˜îSF•ýPæ#ìÜÖ> „a]S‘mŽÂC7<øW½ÄMy݆GaP3ÿíåÚ÷/ˆßÏÒ,~Ý4F¯o…ÿÿÿPK-!sA³Žœ[Content_Types].xmlPK-!µU0#õL •_rels/.relsPK-![¸Éaxl/_rels/workbook.xml.relsPK-!Y|{°Ûxl/workbook.xmlPK-!rKËŒ ƒ xl/worksheets/sheet4.xmlPK-!Ä,ÂB#„xl/worksheets/_rels/sheet4.xml.relsPK-!;m2KÁB#‡xl/worksheets/_rels/sheet1.xml.relsPK-!ìÅ ùW‰xl/worksheets/sheet2.xmlPK-!ÌÌøä‹Z¸xl/worksheets/sheet3.xmlPK-!%ª‹Ô‹yxl/worksheets/sheet1.xmlPK-!È;Á;‚Bµxl/sharedStrings.xmlPK-!ñ¬aXÞ©L ixl/styles.xmlPK-!iÀRŠVr#xl/theme/theme1.xmlPK-!ˆ\ÓÒ '-*xl/printerSettings/printerSettings1.binPK-!ˆ\ÓÒ 'ÿ*xl/printerSettings/printerSettings2.binPK-!$Óë¢JYÑ+docProps/core.xmlPK-!èýò^¨qR.docProps/app.xmlPKž01Spreadsheet-Read-0.63/files/empty.txt0000644000031300001440000000000011275744326020261 0ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/empty.xlsx0000644000031300001440000000000011130415007020415 0ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/test_x.csv0000644000031300001440000000005010313232324020370 0ustar00merijnusers00000000000000A1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.63/files/macosx.xls0000644000031300001440000002000010313232324020364 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ þÿÿÿþÿÿÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿ ÀF€+%T²kÅ ÀWorkbookÿÿÿÿÿÿÿÿ„SummaryInformation(ÿÿÿÿÌDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ  K(Ìá°Áâ\p Abe Timmerman B°a=œ¯¼=ìÿìÿÌ=€480@"·Ú1ÈÿVerdana1Èÿ¼Verdana1ÈÿVerdana1Èÿ¼Verdana1ÈÿVerdana1È Verdana1È$Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ àôÿôÀ àôÿôÀ à õÿ øÀ “€ÿ“ÿ“ÿ“ÿ“ ÿ“ÿ“ÿ“€ÿ`… Sheet1…ŠSheet2…‡Sheet3ŒÁÁaiüÿú£l#¿ÿ£ly+€x眿ÿŸ˜ )\m\m¿ÿžàz“`Up¿ÿ œ¿ÿžt0,„¿ÿž ”à Äè¿ÿŸ`C¼+)¬¿ÿž`t0+*˜R¿ÿž@J¸~)D¿ÿž`+/äÿÌ`` å`Chi¿ÿŸàgo])hñÈ~)D¿ÿž°D$"+0<¿ÿžÀ”à Äèþx2ð`¿ÿžàxèDy „uBH¿ÿŸ-¿ÿŸ \@yÄ¿ÿŸ0¿ÿŸP¿ÿŸ]‡è+&Ü¿ÿŸP#¿ÿ£l¿ÿ£lÏÓâ“¿ÿ£lz•Âÿÿÿÿy&8‘^\¿ÿŸ€#‘^¿ÿÄHü„6¿ÿ£l¿ÿ£n“Óâz•Âÿÿÿÿy&8‘^\¿ÿŸÀz•²y&8‘^\¿ÿŸÐ‘^p͘¿ÿ£l¿ÿ£s¿ÿ£qxèD¿ÿ£r¿ÿ£puBHîœü„y+€x眿ÿ¡Ø ¿ÿ  t0]&Ð$y€y+€$¿ÿ¡àÏàÎ`y&@¿ÿ p¿ÿ¡<¹¤¿ÿ£l¿ÿ¡ uBHC¼y+€¿ÿ pt0ê\,RCrc[Î`},;@$¿ÿ£luBH¿ÿ¢Ty+€¿ÿ¡àhÐPM¿ÿ À- ¿ÿ£l¿ÿ¡h0$$„¿ÿ pt0¿ÿ¡xèD]Zy „uBH'uBHz“`ü†¿ÿ¡P¿ÿ¢ÿÿÿ¿ÿ¡@y+€ ò(‡…““ÂKÁ•‡…““ÂKÁ•‡…““¿ÿ¡p‡…““ÂKÁ•͘ü„Á¿ÿ£l¿ÿ¡ t0 õ¨‡…““¿ÿ¡à‡…““ÂKÁ•͘¿ÿ¡àü„ K(Ì Ë #  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U HBCnÙ` ÐA †<ÆÿÿäÄ#‡Ð…C @–« C ð‰ š Šš0‡  D„C”›EИ<@ ¤Í , ~ ð?~ ð?~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~  @~  @~ "@~ "@~ $@~ $@~ &@~ &@~ (@~ (@~ *@~ *@~ ,@~ ,@~ .@~ .@~ 0@~ 0@~ 1@~ 1@~ 2@~ 3@~ 4@~ 5@~ 6@~ 7@~ 8@~ 9@×6@à>¶@ K(Ì B  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U >¶@ K(Ì ?  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U >¶@ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ à…ŸòùOh«‘+'³Ù0œ8@Xp ˆ”'Abe TimmermanxAbe TimmermanxMicrosoft Excel@€îC¡kÅþÿ ÕÍÕœ.“—+,ù®0Ü PXh px€ˆ ¹'ztreethÖ Sheet1Sheet2Sheet3  Worksheetsþÿÿÿÿÿ ÀFMicrosoft Excel Worksheetþÿÿÿ8FIBExcel.Sheet.8CompObjÿÿÿÿÿÿÿÿÿÿÿÿ XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.63/files/blank.xls0000644000031300001440000003400012536775410020207 0ustar00merijnusers00000000000000ÐÏࡱá;þÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ » Ìá°Áâ\pCalc B°aÀ=œ¯¼=@ 8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ ðÀ à)õÿ ðÀ à,õÿ ðÀ à*õÿ ðÀ à õÿ ðÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`…g$Sheet1ŒÁÁTëZðRð3 ð¿ À@@ñ  ÷ü  ÿ @ È̪Þ<@œ@œ°áFIXED_NUMBERy2pper`€<Qö¹<Qö¹<Qö¹< ÷Ó@÷Ó`ÖÞ<ЃÕ¨çèÿççèÿââãÿ……‰ÿÑpÍxƪÞ<dFormatskey3.LocaleDataPÑ ž@œQö¹<Qö¹<Qö¹<`à„UÝ<„UÝ<„UÝ<„UÝ<„UÝ<`ÖÞ<ÿ€€„ÿ`ÖÞ<@àÓCurrencyFormatskey3 ` Ô[$$-409]#,##0;[RED]-[$$-409]#,##0@â‘ Ÿ@œENCY!@£°ÔP@žCurrencyFormatskey4p[$$-409]#,##0.00;[RED]-[$$-409]#,##0.00°¨¨Q‡@œENCY0©!@£ОP@ðžCurrencyFormatskey5€ªÁ`¡xƪÞ<0.00 CCCQ`¡xƪÞ<ENCYð«!@£П€@ðŸCurrencyFormatskey6°pð3 ð¿ À@@ñ  ÷axƪÞ< ˆ3 ð¿ À@@ñ  ÷ðHðð0ð( ð ð #,##0;-[$$-409]* #,##0 q xƪÞ<!!@£¡P@°¡CurrencyFormatskey8`ð¡[$$-409]* #,##0.00;-[$$-409]* #,##0.00‡`¡À£xƪÞ<@@ ¢DateFormatskey1 Ñ€ÑðáxƪÞ< ¤xƪÞ<! ¤xƪÞ<`@€£DateFormatskey9€Ó/aðáxƪÞ< YYYY`ÖÞ<!ðáxƪÞ<P¥xƪÞ<@@`¤DateFormatskey8pÖ¡ðáxƪÞ<A« ¤!¦xƪÞ<p@à¤DateFormatskey7àÙÀÙñ ðáxƪÞ<°ÚA«P¥!°¦xƪÞ<p@¥DateFormatskey10`ÖÞ<A ðáxƪÞ<`ÖÞ<A«¦!`§xƪÞ<p@@¦DateFormatskey11‘ ðáxƪÞ<°A«°¦!¨xƪÞ<p@ð¦DateFormatskey16ªÞ<á ðáxƪÞ<A«`§!À¨xƪÞ<p@ §DateFormatskey12à¨1 ðáxƪÞ<ormA«¨!p©xƪÞ<p@P¨DateFormatskey17ªÞ<` ðáxƪÞ<y6A«À¨! ªxƪÞ<p@©DateFormatskey13@©Ñ ðáxƪÞ<YÿÿA«p©!ЪxƪÞ<p@°©DateFormatskey2@à©! ðáxƪÞ<ÿÿA« ª!«xƪÞ<p@`ªDateFormatskey14ªqðáxƪÞ<YYYYpÍ1ðáxƪÞ<P¬xƪÞ<@@P«DateFormatskey15€«±ðáxƪÞ<YYYY@ È̪Þ<@œ@œ°áFIXED_NUMBERy2pper`€<Qö¹<Qö¹<Qö¹< ÷Ó@÷Ó`ÖÞ<ЃÕ¨çèÿççèÿââãÿ……‰ÿÑpÍxƪÞ<dFormatskey3.LocaleDataPÑ ž@œQö¹<Qö¹<Qö¹<`à„UÝ<„UÝ<„UÝ<„UÝ<„UÝ<`ÖÞ<ÿ€€„ÿ`ÖÞ<@àÓCurrencyFormatskey3 ` Ô[$$-409]#,##0;[RED]-[$$-409]#,##0@â‘ Ÿ@œENCY!@£°ÔP@žCurrencyFormatskey4p[$$-409]#,##0.00;[RED]-[$$-409]#,##0.00°¨¨Q‡@œENCY0©!@£ОP@ðžCurrencyFormatskey5€ªÁ`¡xƪÞ<0.00 CCCQ`¡xƪÞ<ENCYð«!@£П€@ðŸCurrencyFormatskey6°pð3 ð¿ À@@ñ  ÷axƪÞ< ˆ3 ð¿ À@@ñ  ÷ðHðð0ð( ð ð #,##0;-[$$-409]* #,##0 q xƪÞ<!!@£¡P@°¡CurrencyFormatskey8`ð¡[$$-409]* #,##0.00;-[$$-409]* #,##0.00‡`¡À£xƪÞ<@@ ¢DateFormatskey1 Ñ€ÑðáxƪÞ< ¤xƪÞ<! ¤xƪÞ<`@€£DateFormatskey9€Ó/aðáxƪÞ< YYYY`ÖÞ<!ðáxƪÞ<P¥xƪÞ<@@`¤DateFormatskey8pÖ¡ðáxƪÞ<A« ¤!¦xƪÞ<p@à¤DateFormatskey7àÙÀÙñ ðáxƪÞ<°ÚA«P¥!°¦xƪÞ<p@¥DateFormatskey10`ÖÞ<A ðáxƪÞ<`ÖÞ<A«¦!`§xƪÞ<p@@¦DateFormatskey11‘ ðáxƪÞ<°A«°¦!¨xƪÞ<p@ð¦DateFormatskey16ªÞ<á ðáxƪÞ<A«`§!À¨xƪÞ<p@ §DateFormatskey12à¨1 ðáxƪÞ<ormA«¨!p©xƪÞ<p@P¨DateFormatskey17ªÞ<` ðáxƪÞ<y6A«À¨! ªxƪÞ<p@©DateFormatskey13@©Ñ ðáxƪÞ<YÿÿA«p©!ЪxƪÞ<p@°©DateFormatskey2@à©! ðáxƪÞ<ÿÿA« ª!«xƪÞ<p@`ªDateFormatskey14ªqðáxƪÞ<YYYYpÍ1ðáxƪÞ<P¬xƪÞ<@@P«DateFormatskey15€«±ðáxƪÞ<YYYYcc » Ì dü©ñÒMbP?_€%,Á*+‚ƒ„&ffffffæ?'ffffffæ?(è?)è?¡" d,, ¶` ¶`à? ¶` ¶`à?U} ù%ý ìPðHðð0ð( ð ð>¶@ggÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0 px„œ¨´À Ø ä ð ü éýTuxH.Merijn Brand3@eÍ@@l€…èêÌ@-û˜E½¥ÐþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýéýRoot EntryÿÿÿÿÿÿÿÿÀFÀWorkbookÿÿÿÿ/&CompObjÿÿÿÿÿÿÿÿIOle ÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿDDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ tÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.63/files/test.sxc0000644000031300001440000001241710313232324020055 0ustar00merijnusers00000000000000PKˆ\¬2E¼”mimetypeapplication/vnd.sun.xml.calcPKˆ\¬2 content.xml½X[oÚ0~߯Èò°7c.íÖ2 Z¡Õ&Ñ‹D+m&1`5‰#ÛáòïwbçBhƒJUÚØßùÎí˱ÕÞÍÚ÷¬%’ñ o·MÛ¢Ã]ÌûöëË=º²oŸzŸGO×?ÏwŸÍ˜C».w"Ÿ 9ÉbY{,x«ÄëÝDþ”ŠúHˆ"…ºÈ弌Üp™…ì,ˆ¨¯ŸFäé¸{*ÒqS0$»¨Hð ?À¦~<Œóò ¿–<dù9‚…õ‘ˆªßñˆ”}[†‚W.(Í· ŸR¦hc³÷¹Ôñä §k¯Xæ= >Èk9Ì%’Ò¶fÜ€fÄgÞ¦¸·Å2å@­–D0-@\ïá‘ùÓHZ ±Æ­÷^¾Ëï”Y:™Óc}4šÓ€ æ@7VLî-.i@²D"ÅAgÌAš"ëŒ~Âwx+󓄬?v˜W^ävj Ð’PŒÊ8Å)ˆå M)H8bo)‰1C+æÆ*o·_¿ù¾Žv+‚êpDU8‚¯Êb1 °‰”Í üËF³료$EÌ*PHæ‹‘ÈSe™hË®Ëdè‘MU$¸²¿ÉÆ”»›AÏpégÂkÜOâÏb6kÚå©ì’þ—@µbV=¨D‚†”( £ð"E¸&aäPÏCÛ,i%pÑ+4£Äe¬Šè€Và놃­NþìáT•Ýíav¸†jTO…wrÌn_§ÛZ¤gH¯s²Þ £Ê{Zowޤ/Žìé‘vÃÃìJ;½½R3y(Ü]kbîgŸ?—:Ö'“êG1N»¥1¤§Tp§¬üÜZp¸²ÿ|¸Í/ "n‚«:8ê%‚ŸVÛÎRyäŠZÛóõýéêW.,‚/3튨ÔÖnË>(‡Ã›ºhÏöÁòÒ%¡H¢ì¤÷<{ª=ÉŽ¤þZ²¼eÝÖ- ’èøãÝñwÇ»“ç µ¶Xd„³…í<ÛÂ,à!añ¾¿ûàœÛËoæß^^¿»ûùæ½Å£ˆxò O0“N&Ÿ(ά›û·«ßY¶ãº×)f×5â"vÝË»KË<_›,0ãºï¯lË6êF¡ íåü€nðe3³¸°7R¦3×å`…×VÆžç¹æÙ.6è݃x(á?ÊA´T`´>¢[#Jx(Ðn­Àx‰x…Þív£ÝD#ýétêþt»r?p‘ Ê—GJØÃA¼^-¡,OÖX {‚$jñ’mã>å†Àmår°Ab˜?¨™„G™„%»9pÀs÷#,ê_W5}"T®ÕùAÒaÏ Ä.s¿u[ª¬8dlˆš-çšÀZb™g†È™Ueˆe¶qŠPBèS{­¡#%2¶HUî°…+’¬ó̺5ÖÊïZyRž½i¡Œè‹}®Mƒvb̰ ÁÂÎv$;J…Û€Bd Héxˆ#”Ó¢¬”J ÿôuuL©]ÂS¹ $ TîH‚¨“Ràla[ž¢"ç(†5Ì´ à9“lÞßv8(#ˆuCh`¥ªÅ8ÃåZ¡µo©Öð$¥ø±/Ñ*ݦO{ï"pœòÔ I&SEÚ÷’DǦ‡ùåÜ”¡¢µÂQèÙ{áQUÉí½íVñ”æ&q C òµ =Ö*A.´»§>'|ïìfÈ‘beË)’Du)ò†{µê§dÍiégŒÚ¥°J‰«•½üí—_+§÷”TÊU/ZZL?öóÒ“´ƒŒ•«±àyª‡}¬‘mÎþ(•ƒí\8}M(‡VuEP‚=åÀÿ•ئ-gÏ´a&AiuYH¤î>[DsüòÕ‹X¾YTyŠÒ”!pZy<@³³¶Ksk÷#×(•îáÍŸp6¼·XI‘¨F=§m·?/t5+f;"%AU‡€1'g!0óÀj,×÷´½ê饵éÿëžµÃ$ÞÀDy6ŠØ¶ÌÇÏ:q›¬új4B8Äõ…zzüâdkÒ€ãò-€­X´èÔ+NÆs¡Š~Dk3òYõ357ˆÚ_ã»8´ÿ¬S—ŒõŸ:$æ’QYXp‰”ÐA*­öÔë:«æx¸­âê„þߘû^¾Û€ÍÌRþnãÙ–àÝ[Ô³ OpenOffice.org 1.1.3 (Linux)H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKˆ\¬2 settings.xmlí™mw¢8Çßï§py»ÇâC§3ô´ÎA´jѶ¾ JÚp’ ê§ß Ú2âXÅ=;{ô•!7¿{ÉÃ?7áâûÔÇ… dQr©”OJJ‡ºˆŒ/•uUü¦|¯ýqñgãÁ°ž»Í}yAÚG6†:ƒÀ¢²ª³@V""”ZéBýò)ð-|‡!?"WxëÐZ©ZÙ›Þ†hì­\ŽöÙ¶ø¢‚"".œB7í FëÇhÑFÎW6Û&`uÜT”\09”Z\YþT¤14§d‡ü*ÐMúPÝB߃Pl1 qʺ”#!ÀSŽ“å#ù9Gr›24§DÜ0wÔ…éAð(ÛcšC&s(z*úUå¹LŒÿ|ÝhtqF÷쨫xs–®ÖÌ–=¹ùJøŠZ§BPÿà57+Z¦ŒÄúQþ¯ Hõ( G9 È¿' YÕ‹ÜeÛ_d5iS¢;{/ ‡QŒmÀ2ÓÔÊ×{vD©oIN®K:†ÓÔeF½ãcg¡ág;Âûbu™­¿uŒO?)¾M)†€(µ€9ÜÝÍ2ºˆŸg9,܃OÅ¡Ð-†ÒçƒÈ1Õ ˜²Óx•+gÕJåËÖ§¤ ãz€^i.C}bÒ¨ +Þq²Ð)4 wøC(0"°?ómŠy¦÷ƒ\œô ,j.`z óXY ¸Ã—§îƒy0!—ã™–wâ4~m‚¸/¾Ú.š ž~NðõÁï:u¼>E¼?#ŽÇ(As¸ƒí˜ ,¯\Öp(¶»OK !ñà~æbí¸güÏöŒ[DÞ Ì>Kíz A1B1D1A2B2A3C3D3A4B4C4xxxNote 1xxxNote 2Note 2Note 2Note 3Note 3xxSpreadsheet-Read-0.63/files/empty.sc0000644000031300001440000000000010313232324020025 0ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/perc.xlsx0000644000031300001440000001710611130422501020224 0ustar00merijnusers00000000000000PK!Ì~æ¡Nß[Content_Types].xml ¢Û( ¬“ËNÃ0E÷Hüƒå-ŠÝ²@5í‚Ǻ(`ìIcÕ/yÜÒþ=“„"JEU6±"kî9s=™m½cÈhc¨ùXŒ8ƒ £±aYó×ÅSuËŒr1@Íw€|6½¼˜,v QuÀ𷥤;)Q·àŠ˜ ÐM³W…~óR&¥Wj òz4º‘:†¡T¥ÓàÓÉ 5­6W¹<+O>rëd!5¾cAzœÝ…wÍUJÎjU¨s¹ æ‡k›Æj0Q¯=y‰^ìªS‘¿bÙ9À³­0eP[€âD÷ÎШµ+ìqKèž6Ú'LA•ýøØÚ„G޳;Îä=æÕ[Œ«ÿ¦ÒÑ^Ù°ïûPh{óJÚõÙ @‡Ü€©IB.¾˜ò¦v³÷kDÙç§ð{4¾ôÿÄ@Ç §CØg¥«>0¹ìßñôÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!‡Úpà-xl/_rels/workbook.xml.rels ¢( ¬‘ËjÃ0E÷…þƒ˜}=v ¥”ÈÙ”B¶Åý!Ä–„f’Ö_á‚Ý@H6Ù®Ýs$mw?ã N¹÷NC‘å ÈY_÷®ÕðU}<½‚b1®6ƒw¤a"†]ùø°ý¤ÁH:Ä]X¥Ç:‘ð†È¶£Ñpæ¹4i|¤[ ÆLK¸ÉóŒÿ; <ëTûZCÜ×Ï ª)$òínß4½¥wo#9¹€@–iHP•‰-‰†¿œ%GÀËøÍ=ñ’ž…Vúq^‹kÅ=¾} A”tŠÐöð§à;·î¤º³|N³ê*òÝ ïTÜ¢¼‘ýbSÆÒä`ÅNB~ œöÒÛ#åZ{QÁõ©µ—"¶%eÅc~­½‚<´ù§XÉ~ñ'ñŸ‰IòÖŠ‹/5˜»A˜û…ÄÄo°>Œ¯j®j”3„4Èf÷l–&Æ‹VßÿÿPK!< „ª; xl/styles.xml¤TM‹Û0½ú„ ÇFv–nw‹íe[0Ú²ö*[²#Ї‘ä÷×w${m'e›B/ÉŒ4ó<ïÍŒ²‡“’èÈ­Fç8Ý$q]&t›ãŸûòýFÎSͨ4šçxà?oßdÎ’ïœ{Úåøà}÷‰W¸¢nc:®á¦1VQ®m‰ë,§Ì…$%É6In‰¢Bã"Ó½*•w¨6½öPÇ|„Æ›¯ ?Þ`4Â}1 jI6I’¼Ã¤ÈÈ”_dÑ Ì À„ƒ"s¿Ð‘JÀHB¸¦Šþ£TF„1î¢ïþMbiPr&º ÂA‘uÔ{nu šìýÐK ºƸ+Ñ­¥Cºý°J ñƒEVË Ïk‰Ç£"“¼ñ ‹í!ü{ÓÁoe¼7 &hk4•`’—ŒÉpEVs)waž›;°:5«ÖÁTö¡‹Á"“9âàŸ%Ý/Ié«IˆvJУø‹÷9ò^üG)Z­ø:áÉÏkW Y³9®è…±:«ôŸè¡Ss•çëâLÙ ÄŠpÚ|VÉ´#פ¾@ûÑ«ŠÛ2njX¾?¾õVí>kö, «•c´…ñòªÒ ˆÃy™±‹o µì%¤Xå\t a§eÞâ­§B…ÙþÖ"½+µ¼zÅoÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!a~’†š xl/worksheets/sheet1.xmlŒ–Ûnœ0†ï+õ,ßgÁ$ä¤Ý²¤Q{Q©ê)×ë]PSpvÓ·ïØÃÁgÕ½H€Æßx ¿fy÷Vä š6—ÕŠ²EH‰¨R¹Í«ýŠþúùxvMI«xµå…¬ÄŠþ-½[ü°<Êæ¥Í„PV¨ÚÍ”ªoƒ M3Qòv!kQ²“MÉÜ6û ­Á·&©,‚( /ƒ’çÅn›ÿYCîvy*dúZŠJá"(¸‚úÛ,¯[º^nsÐô†H#v+zÏnvCƒõÒ çâØZ×Dñ碩[è%zgÏR¾èÀ/ð(„%[ —ä©Ê"E±¢ D· $ Á@Y/Çëžøhúñ­![±ã¯…ú.ŸE¾Ï £ÅU¬ËLeáð—”9Ê9%%3ÿùVe.¢ë˜Å—QLɳhÕc®ó)I_[%˧.J¯àb¦¦®øzÙÈ#VëÒk®ŽÝžÃSýðžÁÕaÍÂ0\Ý ®“PvEÓ†¦b¨yy˜Ïp:ºÇÅj]æ 90h™gsz›‡5¼wC’ÙôFG÷°ÈÕÔ6jì »è;é.¸ÑÑ=Œ¹Z‚Z×ÇAs`pàžÅO7¦ƒ{V¸˜öU¤ÙªÃ»ôò.»N5b#uðÈÛeÔÕž7ªïÊË»êš9áéà‘7í&ª=oTž¶·ùgpýœàtìˆ §ýD¹çY²¼ño°¡ Žµ€c˰¡(ÀQv€ ,ݳExl¾å ÒD[̱mÈìô:ê.ô{A±ß6|s˜í/ñüÇþ±OgçnI—€uœNp óûë746±+Ìv¢ÈS‡íFŽîbýŽÄÐ’ÂÅØÆk{’oû¶/9º‹õ{Cs ÖKÚqm{òµõbz¶gNp+óC'ƒÊfa›YäyCf•Ùþv:Á­Ìoy =*›•m{p³Blãst—ë·>†Þçkí䛨@èè³x9§ŽÕ%¼ó9 n©~×dh›ÎWнV¶uÎΙ„–Ò[ÁÊN'¸•ùíÆ?cv³ïwÊØ3ݜ֬g¶ëžNÀÊpÄÙ«Î`ˆVy óßNVJO—àêo “u%Yu“¸žÜj¾_y³Ï«–b^¨çCÒà´ˆ7JÖڬɳT0ø™Ë fl³˜,ŠTý ¬‰Ú£yHx‘ï«§\eEOºzb&ûõ?ÿÿPK!Û2'ÉCXdocProps/core.xml ¢( Œ’AKÃ0Çï‚ß¡äÞ¦Y©ÌÐv ²“ÁŠâ-$o[´ICíöíMÛY;ôà1ïýóËï=R¬ª‰>Á:Ùê‘$EhÞ ©w%zª×ñEÎ3-XÓj(ÑZU—7”·lkÀz . $í(7%Ú{o(ÆŽïA1—„„ÍmkóáhwØ0þÎv€iz…x&˜g¸Æf"¢Rð i>l3ÇЀí& Á?YV¹?/ YRI4a¦“îœ-øØœÒ'§`×uI— ÁŸà—Íýã0j,u¿+¨*§Üó­­Xù¦ <+õëk˜ó›°é­qs¬¢ÿ.Ì`=²@DÁƒŽÖßçìö®^£*¨\Ç)‰Ó¬&% šg¯ý›g÷{¯± N/ÿ‡˜×$§dIs2#~ªÁûü/T_ÿÿPK!H뤖docProps/app.xml ¢( œ’MoÛ0 †ïö Ýk9Á0 ¬¢M7ô°¡Aóѳ*Ó‰PY$ÖHöëGÛpã´=M'ò%ñêEq}llÖBLÆ»’Íò‚eà´¯ŒÛ—l»ùuõƒe •«”õJv‚Ä®å×/b}€ˆRF.•쀜'}€F¥œÊŽ*µBJãžûº6î¼~mÀ!ŸÅwGWAuÞ Ùà¸hñM+¯;¾´ÛœKq‚5Z!½Rþ1:úäkÌ~5XÁ§EAtkЯÑàI‚OS±ÖÊÂ’Œe­lÁÏ‚¸Õ m¥LLR´¸hA£Y2ils–=«NÉZrHX]Ûô± £|‚øòlUNpjÄ>œöNcóMÎú .;ƒ„ —ˆƒÒC½R?!žM‰{†wÀ¹%¾áÊ)^ÿbºèõÒ7A¹“\=>,·7Ùm¾ËUñÛ¸—´ §ÆÉ^Šb}P*úŒ±~Ä= 5ÚÎdyPnÕØó±ÐíÁnXv9›çþûGMðóZËÿÿPK-!Ì~æ¡N[Content_Types].xmlPK-!µU0#õL ^_rels/.relsPK-!‡Úpà-Jxl/_rels/workbook.xml.relsPK-!¨R'ÜFjxl/workbook.xmlPK-!< „ª; Ý xl/styles.xmlPK-!iÀRŠV! xl/theme/theme1.xmlPK-!a~’†š Üxl/worksheets/sheet1.xmlPK-!Û2'ÉCX¬docProps/core.xmlPK-!H뤖&docProps/app.xmlPK >òSpreadsheet-Read-0.63/files/merged.xls0000644000031300001440000003400012474071332020354 0ustar00merijnusers00000000000000ÐÏࡱá;þÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ » Ìá°Áâ\pCalc B°aÀ=œ¯¼=@ 8X@"·Ú1&Ü DejaVu Sans1ÈÿArial1ÈÿArial1ÈÿArial ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ ðÀ à)õÿ ðÀ à,õÿ ðÀ à*õÿ ðÀ à õÿ ðÀ à¤À à¤8À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ¼$Blad1ŒÁÁTëZðRð3 ð¿ À@@ñ  ÷ü& notes monextintÿ { wL0°ÞΰÞÎ&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?~‰•)Ï&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?øÿøøøÿ&úaU$ü?øÿøøøÿ{ wL0°ÞΰÞÎ&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?~‰•)Ï&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?øÿøøøÿ&úaU$ü?øÿøøøÿcc » Ì d-Cëâ6?_€%;Á*+‚ƒ„&ffffffæ?'ffffffæ?(è?)è?¡" d,, ¶` ¶`à? ¶` ¶`à?U} ”;;;;ý ý ý ¾ ý ý ý ý ý ý ý ý åìPðHðð0ð( ð ð>¶@ggÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0  px„¨´ÀÌ ä ð ü  éýH.Merijn BrandH.Merijn Brand0@@@µb.—Î@…l‰VRÐþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýHÈÐàèðø AppVersion DocSecurityHyperlinksChangedLinksUpToDate ScaleCrop ShareDocéý12.0000 Root EntryÿÿÿÿÿÿÿÿÀFÀWorkbookÿÿÿÿŽ'CompObjÿÿÿÿÿÿÿÿIOle ÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿPDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ dÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.63/files/test.xlsx0000644000031300001440000002421011130422501020244 0ustar00merijnusers00000000000000PK!‘·„øÚ[Content_Types].xml ¢Ö( ¬TËNÃ0¼#ñ‘¯(qÛB¨iŽP‰òÆÞ4VÛòº¯¿g“ PHU¥—DQ´3³³³;Ê"ÚGmMÊÆÉˆE`¤UÚ¬Sö±z‰X„A% k eG@6ŸÝÞLWGQµÁ”å!¸GÎQæP L¬C2ëKèÓ¯¹r#ÖÀ'£Ñ=—Ö0!›MßH€× ¢¥ðáU”ÄÄÍsœ‹žšÂŠ;e¹BKH9ßõ‡5¶Y¦%(+·%q%5Ø]…Âÿ%Äp,S¡ó æ¡,’´e^@&¶Eˆžä@cº‡/kíÛÌ„*ëö1×{ú½ë÷doýæÓÚ͵]©ÜIJ¡M«»+4½¥·9Íz°¨,W bGàƒ†“g]ÜÀª÷zŒÈë×d°†ßÑ8á÷yСcø6œÑÑ‘ÒÝÀý£ú…{º+= (mY-+^»Á÷ŒÏ˜ ê=xRyõ3ð»OÇ)óÒz¸ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!J©¦aúGxl/_rels/workbook.xml.rels ¢( ¼’ÍjÄ0 „ï…¾ƒÑ½q’þPÊ:{)…½¶Û0±‡Mlc©?yûš”î6°¤—У$4ó1Ìfû9ôâ#uÞ)(²ºÚ›Îµ ^÷OW÷ ˆµ3º÷ŒH°­./6ÏØkNOd»@"©8R`™Ãƒ”T[4e> K—ÆÇAsc+ƒ®ºEYæùŒ¿5 šiŠQwæÄ~ Éùomß4]¾~Ðñ ɉ “ Ž-²‚iü^Yyž¡\“áÃÇYD>qW$§K¹Sü3Ìb2·kÂÕÍ ÇT>:¥3[/%s³* }êú±+4Í?örVÿê ÿÿPK!5$ô4H,xl/workbook.xmlŒQMO1½›øšÞe—ÅE$ì’5r1$"œk;Ë6tÛ¦-.ü{§%(Ü<ͼ™yo¾fóC§È78/®èpSš!õ¶¢Ÿ«×» %>0-˜2*zOçõíͬ7n÷eÌŽ €ömC°Ó,ó¼…Žù± 1Ó×±€Ðm3o0á[€Ð©¬ÈóqÖ1©éIaêþ£ašFrx6|ß'Šß·ÒzZÏ©`}Úˆ0kßY‡s%Šùð"dQÑ{„¦‡«€ÛÛ§½T1[æcšÕ¿K.‚¸íZBïÿâ’ÃFjazdMðzÇ3zDЧÌFŠÐâqÇ£Qy޽ܶƒùd”ÇVÙ…|º¶I–è´ÀG¼ÛŸígDßM%:n!†Q᪸т$Ò§¸à©k"a+Î_:M/ʇ¢LçG×?ÿÿPK!ãý¯P®× xl/styles.xml¬SMkã0½ú„î­â@K·X.{ ,´PH {D²#Ї‘Æ!î¯ïÈvâº{Ù½ØoFš73oFåËÑYvÐ1™à%/îœi¿ ÊøFòÍê„àØàµä½Nü¥º½)öV¯÷Z## Ÿ$ß#¶ÏB¤Ý^;H÷¡ÕžNê ™±©TÊAΊåbñ(Ï«²ۅΣäËÉQ•é“ÀR] .ªÒƒÓ£ý3°ÙUƒ3¶Ëì™iäû‡ð%±öº,rTe ˆ:úl›¾%uã×¼Åã°B󋬾ÿÿPK!¼« 1Ö¸#xl/worksheets/_rels/sheet2.xml.rels¬Ëj1 E÷…þƒÑ>ÖL¡”x² …lCúÂÖ<èøå¦ÉßסÐv ÐMw’.::h»»øY9˃V7 8Øè¦0x=½¬ž@I¡àhŽ \Y`×=>lê"îk&ø“·ºÖ7'\ü»ûÿÿPK!°—j%Ðæ²àm•П›Ë“9%Ú°¶`B¶ÐgÐô"ýø!ÞIõ kC¡Õ ­é"ÏÓy ÓÙA‹H)Uà þU•§;¬pEðBß?÷Æ[Ú3Dê_8dYò2™ohMO¢@0ƒþuÍ;MÓ¸àˆÙ†ˆ‚2¡Ë ZO©—ÆNù‡ý&¶‘{),p]$Ô·©Þ_¹—®‘E (ÙV˜•w¼05-˜Ì1Ñ=x+wWÀ«Ú NØ«g̰4VrG°ÛGÛ1;» :Cß¹ .1Še¶Ç4bïÝä/àê Áõ8@åÍð-ͯ=hž•ÎPfKœÙCÊÙqÊzŸb'7V›¾¥¶Äèêü˜jeK^©ÍŽS²} ª9‡øvG„ó!»·Ò¿Ê~ð ¨ V „&¹Ü¶è"Ä9Ñþ¼da„ !ù«øj¡´mqð u¬‚oLU¼ÕD@‰”þd6Ÿ.FîêOÛ˜‘Ý;U÷ÒÙ¼Ö¸L€'f1™Ÿ£ÇŸ¯Oð…”Rš÷alÃ:ÿfÛ‘’›ÜX¼¤â¸\n§ÚIe㆒ã¿%"ëxB§>¦âÕax>Š qoìÒé&xÕÞqS¿ É.XË¢¸röÓO¬é¾¬Ü'ÝàâjòväV6¬ý| ÕV0E„îk{‡bËÓëüÏ 6NÙ#{aˆ½±ñ4P±ü9Sl‡—!Q/ª®‹ÀáúKÿÿÿPK!òŽöëŽD xl/theme/theme1.xmlìYOoÛ6¿Øw toc'vuŠØ±›-MÄn‡i‰–ØP¢FÒI|Úã€úa—»í0l+лtŸ&[‡­úöHJ²ËkÒf¶%‡¢~||~|¤®ß8Ž:$BRž´½úÕš‡Hâó€&aÛ»;ì_YóT8 0ã i{S"½ï¾s¯«ˆÄÁøD®ã¶)•®/-Iº±¼ÊS’À»11Vð(Â¥@à#³¥åZmu)Æ4ñP‚c{g<¦>¹¢Ebo#Þc !QRwøL ´h’ØÁ‰â\ppP×9•]&Ð!fmühHŽ•‡– ^´½šùó–6®/áõlS Æ–ÆõÍ_6.,"JëýFëÚV!ߘšÇõz½n¯^È3ìû°T;—²ÌF­ÞÉe–@¶9/»[kÖ.¾$enέN§Óles±B È6søµÚjcsÙÁÅ7çðÎf·»êà ÈâWçðýk­Õ†‹7 ˆÑä`­ÚïgÒ È˜³íJøÀ×j|†‚h(ÂK«óD- ¶?à¢dXÑ©iJÆØ‡8îâx$(Öð:Á¥7¶Ë—s]Z’¾ ©j{ï§rb&ïÕóï^=Š^=ròðÙÉÃO=:yøƒ•å ÜÆIXøò›Oÿøê#ôûÓ¯_>þ¼/Ëø_¾ÿøçŸ>«B Ífôâ‹'¿>{òâËO~ûöq|SàQ>¤1‘è69Bû<†µø3'#q¾ÃSgŽ@v…螊àí)fU¸qwO{ToN8sDb¢h…æ(v€»œ³•ØÑºJN’°Z¹˜”qûVéîâÄqmo’oæA騾gš{ X‡$! éwü€ŠÕݧԱë.õ—|¬Ð}Š:˜VšdHGN ÍmÓü2­Z3¸Ú±Íî=Ôá¬jÕ[äÐEBB`V1ù!aŽoâ‰Âq•È!ŽYÙà·°Šª&9˜ ¿ŒëIž ã¨)«ÆÜ°Þ’Ów0V¥ÛwÙ4v‘Bу*™·0çeä?èF8N«°šDeì{òB£=®ªà»ÜÍý ~ÀÉBwߣÄq÷ë‰à. )ÍD¿™íK`j‡cšü3 llcà’ŒÛÞ&lMU)±}Š‚áþ…Ä»…'ÉXŸßx.y÷’w½ÿ<ï.Êå³²íŒ`{uñ` cS&Ç‹«ä1el ¦ŒÜ’¦P–°[}èÔÍ‘Ǧ4‚fÆî.ØŒA‚«¨ŠN¡È®{ZH(3Ñ¡D)—pº3Ý•²5 ueφM}j°„ ±Úåí^ÑÝùá cöœÐAsE+ZÀY•­\˄²ßDY]OêÌÚêfj†ëmÅ’Á‰óKƒÎšP† (^ÀÊ«pJתáp‚ ´Ý휻Åxá"]$#ÌGzÝó>ª'å±bî v*|¤Oz¯±ZI[K‹} mgqRY]cºÜ{oã¥<‚g^Ò‰{*YRNN– £¶×j.7=äã´íá\ Í8¯K]ùaÂõ¯ì}‹“¤E8YÇÙd6Y>óf+_˜›u¸«°vŸ[°£"RmaY æU,Ñšìü—›`Ö‹Z€ô7˜ÅÊÃ?6 °£ëZ2_•]êѶ³•ò‰"bGhÄ&bƒûu¨Âz*ázÂ0‚~€Ë4mmóÊ%ç,éÊWXgû1K#œÑ­NÑ<“-Üäq1óTš¬­rîfqç_ŠIù ZJ9ŒÿgKÑû ܬÚ>\æ Œt¾¶=.TÄ…Òˆú}•ƒÙ2!ZàB^CPÁ•²ù/È¡þosÎÊ0i Ç>µOC$(ìG*„ì-™è{°z¶wY‘,d"ª4]™ÚiÈ!aCÍ«zo÷P¡nØ$£ƒ;îs–A£P9å|s8¤’,+¸&'ï ®|l2ƒ>—‡MA“Û¿˜bÅ®jÇ›áùÞ{šõgeV#Ï PVÚ ZYÚ¿áιÕZÆš[ñr3Ÿxq~ÅÐYD)Üú ýû>#&Œõ†:äûÀ­¾6ha6ÕWlá4AÚÎN¶ÓúY‹²¦ÍJ'mοÉß…ÞSÆÖ3;‹¿Ïiì¢8sÕ9¹x‘ÆÎ,ìØÚö-45xötŠB×8?Éǘ[åoO|ô½wüf¿FÉžL¤{Žà¸Iä&:ŽÇ"ÖoùxŒŽ ÅM3‚ƒ=ìX!:ëP$@o^TçCü‰T7 7Ãñ!°Š‰Ý0È[8Ê[þq’7E‡6áL¿zÆËx]ÃjË*\v*ïÚÎG/övåbY‡‰Ã"ËGÄ%^|’Æ&ÁA/ Ì%jÛKàó¤§)<&ì,vÝ2H…); lc Ê¢ê°q$ÁÉÚ#LÁÝð¹TÝŸ1ã Ïg4ŰÏA­üá ˜{/i}my >Ÿ*ó ’7Fyc’ÂÖm˜(íÒ–j¹Ú,ÈXrmox8¹Œ6tÆhË‚ r`žî€³†ƒöÀìú‘¢ÜøÿÿPK!¢Iïžkixl/worksheets/sheet1.xml””Ms›0†ïéÐèÐScÀvüU “Øõ¤‡f2‰ÛœeX@¨´¶Ûþú."ÆxšÌ´>Øxíû®VZ«Ÿ¥b{0Vê*âÁÀç ªD§²Ê#þm³¾˜qfQT©Pº‚ˆÿ˯â÷ïƒ6϶@F •xX/<Ï&”Ât ‘L›R ý5¹gk"uI¥ò†¾?ñJ!+Þ*,Ì¿hè,“ ¬t²+¡ÂVÄ€HõÛBÖ–Ça*‰5b²ˆ_‹Õ˜{q蜿K8ØÞ3C±} BJ à¬ÙØVëçfá ù¤hÝ‚FQ$(÷°¥HxL½ùÑz8¯sˆÃÓóÑmíZqoX ™Ø)\jõ$S,È5L>š^ò#|Ї[yD‡ÇúWE}`Ô/*×Ö¢é~°SI¼¦(¥5ØÇ~èí©˜ä…ÝôYpÎV}6ì˜G^áðUCŠv†£.ÑsÓg㎉Ž^¥h'zÙ%:ÑeŸMÎ٪Ϧ;3lÎíï¶Q´3œu‰í.úl~Ζ}œúÝ:¶× =´ZäðU˜\V–)ÈÈÌLgÓñ¼÷¡q3í±¿ÊP×odm5¢.߀ÍÐÕ˜f“ ÷ñgŸ/è€2­ñmL7¯©üpW³LâFo&½,´‘4‡nü"^kƒFHälga-Å{J¼Û•ÛF®WAËkZ¯VµŒøÈ'zù Lzòkë]»²˜P2¯ž$/½kGR§é­ÛUüA”õ§¥ûæ}ËîàÀt)ªï”0ÜÑ`è~®Cï”Òcëó?:Ͷ˜»wb/ ¡×/œÆ®{IÆÿÿPK!ã)?޾ xl/drawings/vmlDrawing1.vmlìV[kÛ0~ì?ï¡/Nc;uÛ¨v ëèSéÆVØÃE±”X¬clÅuúëwd9·²Kaäek ±|ÎwîçCIÚBüêš6©·¬4­³\¬2« †™dPЦPÞÛ7=~‡„ÙLf‚ºÇÖ¦}h3¡¼ ÆI€Ö9+…b+XÒPÑšÔ\šNmõ’¬ÜÓÎ K½Èv.†{>&Iã\šU)ˆä©wßø¹7Qy$¨x-ŸÚ‡§Aàw¿A%F¶L‹”Ìä©WøÊé+‡UîÑŠ>9Œd*XòR×f¥Ðk!¨\fS±ŽÈ¼b\ mºRa‘zÆÌ@k‘›gêUxZ׳SÀ¦šÝJê(8{ľÛ+Ï%qTB-MÙ´µ4âÂU°j.õ@‰™¡áèä8ŠKsÑ ”4v’GÉMNÇcTæBÎsCãøØBŸRsÑÒ°óÖÈZN¥’fEsɹÐGd&•Ê@A•zRÏà=Ëó –š“oçÁw[3¶I˜8VÌ–6}´–84~nÛÚ6{Èá‘€îºØG›* …þ§u¶¬μïåfϺ­A‹íŒ .ÝZ»L„$\6¤o£U ˜’sMmÓŽ&ɵ.6t×.i镲3þ€»I>NpžwÝdoÁôûBôWï«4ù•PªvEYñ¥Îr¨\$òIû$ðÉ™OF>9Å—”’á> o [>¹fªVÝ¿»RZú©’Ú¸l¶˜]áx‰Ó¸Æ!lQÉ.äFj±é$kˆ~‡MÛB6’5ä3R ëU ©‰­§K ?ß_ËP,ŽZ×GÂÈp°‹7Ã,*u‰KèD†½ÖÜt¯â€”&ç8')ŽÍÈ®åQB¯7Eñ®ƒóª‰Iºû j"°þkØ[#¶Z-Öèßô’c&§LªMÖʤÚÎwêLN™T»yë˜IÉ}^úwÐécö ÿÿPK!å€ä „xl/comments1.xml´‘ÏJ1Æï…}‡»í.ˆÈ&Å EAŃ>@ØíògÉÄÒúô¦Ín‚॒™o&_~IšõÁ¶Ç@Ú;ÁWË’3t­ï´Û þù±½¹ãŒ¢r2Þ¡àG$¾–Å¢i½µè"±dàHð!Æñ€Ú­¢¥Ñ¥JïƒU1¥a4T ˆÑ¨Êò¬ÒŽËF}ÅÁšùôºi ‹rRu:òES¼$,`/ø¦â,÷?w‚—É2â!5…4ÞÓDßl¯Lº_É!I[ïb‚Væ¤õÊjsÌbuà¼1Ê7‘­Hnœ ÃÄò›£¾.GU,Î<—õŸ\W檋ÅDVÿM4¿Yþ¿9#ùÿÿPK!…QA2docProps/core.xml ¢( |’ÑNì †ïOâ;4Ü·÷ìFÉ.&j̹p“S£ña\Ñ–@ë¾½Sº­»Æ˜pÁÌü|Ìü°<ûhêì|0­]V”$«ZmìfEn««ü„d!J«eÝZX‘-r&Žþ,•ãªõpã[>’làÊ­ÈsŒŽSÔ342¨°X|j}##†~CT¯rô¸,´(µŒ’öÀÜMD²Cj5!Ý›¯@+ 54`c ¬`ôKÁ7áÇ©²§lLÜ:œi×î>[«¡8©?‚™„]×Ý,µý3z¿¾þŸFÍí½R@ÄR+M¬A,é×wáíñTÒS€åAÆÖ‹Å¼y±Ù¹GÛÓé±Ô›þ Û®õ: à B‚† ¼qŸrÀ$P]Ë×ø¶OôùVd ñ-ÙßááÝôBüMŠ)ìk½üÆA ¶(YžVU–¼\ð{˜˜£HÆ‚ÎÐJ>?Vîf—Õèæ<ÇÅŽ+ÆÆÙ òFUro€Ín”߉§©ÃyÅæœrVîGÀàåáwŸÿÿPK!½cõê„"docProps/app.xml ¢( œ’AkÜ0…ï…þ£{VÞ%”²È !!äPèÂ:éyb×"²$¤‰Éö×wl7»ÞöP¨N3oO#©›÷Þ¦lƒ¯ÄzUŠ}Œõ‡J<ÕW_E‘ ¼÷]rïQw³"ab¸4LØï{:Œïó»ýMÞS'öãûÐY‘ø>qïéš„åS÷‡©ï3¬üJœ¼àdzćO'ä5>œ¦=zÖy†#g‰Ÿö"g }8MË õðñ9…>üÆœ²R_­Ä?ñâ5ðÃïýe’¬ïƒívûa;ü@£ÅÀšÍfƒìîÎaw—n½‰‚,•çH@R°x`}°eÚI¨iÚC—ÂÍê™Dà¢q絿,ÀŒxYÔ»t"07²ÄÇÕ;ôàÕ;ôŸ]9ɲ¦N¦ƒGv3ûñøeÏ…hÅJÓ•ùkp6óÔ‡ÏSJw®¦ä 4s×6ÍÑ ÿ|z{6ù6ò$wÏ&wÀÝ•8]UKg X ƒ¼¤4Ý?-ˆ¸æ{ßÞ%޽ZÓÿxüòä.ÉÊÙ'ö/'6ü0Nœ0-™"¤ÅÑOeÐÌ <ì.ÌYð4æŽK ¸AüécNþÝå^þ9­Ä‡þçÈw‚~q¼L°òƒ·òúàüÃ_Hª¢÷gš,}·ÂÈo5ÿp”*¿Ôï™MS ’Èg•¹¢‰Bv”Ú´ìÞ_Ï‚ï“á¡o\ßsz?Ò0¦©G?J††žUŽU[kçâ­Ç û½o¡ÏzjÒ{|ªÍßiB@Aåöä„qiýR¦áÆ×·5)CÀ“}rx­&Yû‰Ë"üÜ%Þ%7ð“8‰ˆ³êýDþ# i­£u€Ë­©§Ÿƒg'|ë}~üZÅÞ‚S»4î`/#ëŒa³üUÀÝl ±w·YŽÀÌ—ç¬R!LmÃ¥§oO?hyœ ˱A]·X\w6 eÃ)ß52;»þ2ûy” —Z;°ÂñlÌÎF‡ÁföË'/ëˆJ¢Ä'qoNïŸY«ûn<6v`SèÒb‘|ë{éÈÎü0™Yw~Ö ü9çœÝ–sÖ‡ád8åsnØ^ÉM­©Åçܨ½’›ã1Ÿsãöœ»997i±äF3›Ï¹»Kn:ãlÓÄt8ãsnÖ–s6+9›‹sQ]ŽèöÄ3våЭüVzqIüÅ2I‹ÆšÌ† ý¼Ë›˜tø+'0O¢ áq¼&@7rܾ›YŸ;AÌåyMônäùд§­yMdoèxºÛq¼&ê7sÜMZrÉâAörÔóãuà¼Î¦ÓÙ–.Œt2õÐ"#yæñ»ºqýþ™Fl)Ãíê– tûsà/ÂT»“áyuÓx*Ô ó:˜ Ùø¥÷µû'‰zÅ'6·ÈšvIÌ:¸~yg准&dÁ,zþ‚MÁÙÀ!ƒ®@ÛYg9rY¥ÅPá†e!úQÜO×0>ýfçUöq÷éÔ@QM|Œ]Ÿ=í³y—q»‡wÉ뚆éªQyÛ¾XªõÞÞ™{oç‘ã&> Ϲb¹Âþ$‘“Ð:W=Röû$Å%oÓ*¨¬}óÀÙ,Q±nv`pÿì™ñ©›×’`§&®(-ãìCÑ"ÿDæÎ&8)Öñ8öhôÐÿõ|n²¥­,!Ý$’r4rx+½n$ˈnËñ¡²:>šêK¡ +»ûÿfW-s\+-° d—óRY:^ºÖph9»± =e>a—æ¶EÏXÚ;ð)E7œØwÂ҇ÛYÑw+ÎížIYOW¢òZkw¿á4 |b@ê44¢˜æTE¢Ôé=ˆD1Íù\å½¥N{CìzÒš(ï(u:(*Qt×óþ‰R§I#v=š(*¥n}‘(®«»ž÷O”ºµ4¢LÍô?M”÷N”ºu3N¢ì:]UsÜï Ví¡gœ+>Z¦D'ƒ0-©Ð,$IQ ˴ʤËôHQ,Ó•,C3Eõ˜ZßR‚eHJ¨8–éS–!ɨ¢zLÍ2%X†¤ÁŠb™–å”`’€+†eZÓS„eHê/Ë y‚ÇÉö•ǽ“€Á£õTh vûÒ1Ë´¨§ËÚ—Ž¹X¦E=%XÖ¾tÌÕcjQO –µ/s²L÷˜ °¬}阫ÇÔ,S‚eíKÇ\,Ó¢ž,k_:æ`™õaYûÒq1qäqR†òX: kq'—ò{Ýp¤¾œÍ ž]×CaÖ…è1´.åWôX?UôN1|&rÍ#¿W^Mˆ›w°ëÈÓ(L˜}†mø|©¤Wù>g]ä&pŒ¥ïy$ÄÊ…H¥6¿·ÞÖKƒF>3â$> —ô¾ëýãq˜ø‹Ðˆé&rÆ‹lØØëm½«±ˆ¬‰sÙb¸Æ¸œµAשõ´’ôó®µø+¿ìND;[´pÆ éÀÊüåÔ›cÊÄKVÚß„s?9.–™*ŸKèzß(Y: æÓò¤á¬œhá‡F@æÌœéïjuù‰.Œõ˜okgÁW©"…ÑNWꊵ½€H«W‘Räuõ:÷_ße…:›„®˜%÷rîsýÐ'ʧu‚jZ¤ØÍšÅãVëX¤×Í:††ç6«Ù2EÊaݬç†QÛe9#‘к¹Ÿ±›uÍ·[¨e‘ÓénÖr“ÈÝBE‹×'ºVÑ C7 =¡-^ÌéZEsÇmÑU|»J×{­â&A[t-ß®ôu¦–3ÕöF+ùFË|—bØ-×ôÍ)$–ù.e°[®ãÛTH”°“M?ùÕMLŒ­ztkd;OŠ}@y%<ˆ¸ ¨÷-ô]V½Ç'½¨¥í@–…$³Ý‰~ð“8‰ˆ³êýDNïÉ ãÞ# ©&SkdBÒñn€LOßž~Ò’@!$‘ð(ôeãú^‡¾¾­IÚÝ›¦RTB’!o‹Jš?­ñIݼþdãk)Ìy¦'Š7Õ¶1Y“!pqI.½ÎÈž“u>H:ì Ðç¦fc]£’È{4ºyX×ȃ¤ßynhÖ5©£MËž{uŒ9¶:‚4|Öå'Nà»72_/©eÍÕóõz„kæë¶:ês£¹—&‰ÔÑŸ¯ši2aIºÁoVaÅã.Ý=îå-%ÿš„ª&4@´é’²=kŠlоC68œ dSF\ƒã²ÁÉÙàÝÄ`¸Y=“¨Hù÷uï¡o§cÜfôè¶4b 'þ1{½"àì¿ü:ýR Ö\ib¹ïןÒòqP|`œ˜hf4"ºÍEDHˆnõ™ÝB7º]²1ºÕ7–ŽnÑÍi'¦p3ÓBJx9o|F-rpb‰5µ+Ú^Ed ,2ˆh=•Pf‹X³ö°ÒÍma¥íÚÂJ%´¶°Æãö°&£ö°î†"±$Ç”·¼²EÃ"š ‹UXh°h…„6„Å+$´,b!¡a1 m‹ZHhw°¸ÕMr4EJþ±[e0….0¹pÀ†°À…‹[8`#XØÂâØ´pÀî`1«)˜ä  ‘ fÕQ²ÐlXÌBB‚Úµ°Ð`a m ‹[HhXàBB»ƒE®Æh’£ ,T6QÁ*à ,xaÁÙ°è…7„…/,¸,~aÁa Á°à&°†w‹aÍá$‡XÐlª‚W†X$Ä´aÑ r‹h˜#XTÄÃ"&äÝP!aò它”z`‘µá*YeäávHr G¬C’A8B’ÂéŽ@‡¤ŠpÄ9$i„#Ì!!rD¹wªÈ@š­žŸèZ˜ ]jÀBW0ÀFÐ… °1,”á€M K–`wÐK °)tÁ²­]*‡WŽÌíçü9ݾšToç´¯ÛÎi‹ÜÎY_éN†f¸×4-ÊÃ;}ËŽÆûúÏ>â`.¬ûAÇžAǤÇÇm‹WbîÞpOþªôiS±Öö>ظÀƒáè¸À7cáã; l\àÑt|ܶx%½á{ ƒ¯Ë(&­Ø ±|3• p`¯$xê[x«„ãoÛÇkoå×_}±Ey1ÿê‹ò“GÝMº ”… ûýéÿPKà·Ý"æ®PK—pä4 styles.xmlí][sã¶~ï¯àp§™Ý™R¼H¶.±äÙ¤ÝöaÉÄ»}ÍÀ$DaB´¬>ö÷ôWõ—/â]DÙ´ÝÍL6€s¾óáà€‘›Û'ßS!‰–ª92T6vPà.Õïß¾h3õvõ§¼^#.lÇ> ¨Ñ#…5¢ER¹Tc,0ˆP´€£µ8„AÖhQ”^ˆ¡’Ñ™ls!\lMá•mÌeKmÁƒüÈB¸ØÚ!`+Û˜Ë2L‹Í×X¶ñSäik¬ÙØE-ž<ü±T7”† ]ßn·£íx„‰«›óù\µ¹Âv.ÆÄRŽ­CòÁ"Ý™z&ëC dõã²E•‚Ø€D@Aͫѣ+͈G·{ˆ47„pÙ½cGÞ½c§ØÖtÓâ“™~Ç*Å¿î¾î¹@|Ù±¸l *› PÚÌDºØcœ«Ê$T¨kÆDOž ÒÛNñ-A’‚¸Ý)nÏÎÇ~hLÎÔ™„9MU% !¥°µÊbÔ³ø´6Ôh{Ñê&áV^¬$Ï£¥ú™ à© £P&à#o—•ëÝ¿BÊ,UþŽéÙ üBýX’JŠT¥Ô-—Ö\@‚V>v dÆ&¼OÓR~úÖ9ø^¬¿Ñc9@ùö`ûè%±ÞFÎ1[½Ö5@´EQ$Õ¿ò=@l„ÊÝ}«}UA ¥Hq»A”õ~ã¢ì%Ôø¶ a6³%4Ù‹Ë{½("j³ºFOÐ9¤æOˆF”@à+ÿ„$ÿ¸UѶÒ¸ªégï;åóÝ·&ö¦œÊeÔI{Œxl­“s`Äìk®Tyò{uO³HàãlN•aês¨tÿýþo´,‹õ¥˜Þ¶,¦åI&ŸàÀ5ˆ½4¿ÏzNµù¯fCÏS3ñ}‘¶ºŠØ® ëÊF>`4ZªÖ¦ànê­XlpjŠ(ø¶Â]¡ÂšÀsøz;a^’k¼ð@àÆÀe06ŽJ˜AßïÕjkåO ¨ÎT!“õ“‰8€Y]ÚeSÕ¾kž£zð©iæå}ç2M½—+¹oœ¶ºI²ï4 /y2Áçž,•„”ôÉG† ]ÖÎA. “,·5ô™÷aÇ„°=ã®i(Ó¸þÕÈìxÄËÑù†‹’ª ìüìeÚì°E=“Íœ÷ËWuõßÿ'W­ÒIÞ9§ËJÉÅÄc³õuÂvã’պǡØ/ ³ p•‘‘Lmcºà®‡ÙÆêÃzm°?|¬·Šaq,­2tÂ|‚¢b+ð¼~üôƒK\æÄaè¥hk%böUû,2éaj }Ä'gô^uèιÜiî Ìº'¦eN Ñì}1bvR¨!ÏìLòÌ/Lž~bqoä™ʬ‹0b~#Lã]1Â4ž?œ —<ÂùçÇ”$ÏXˆ˜­æÐm­rä [-9[µ£àS®y@9EŒéô€ŸåæG÷ô0“é!Ñ•w¸+S®«3–{¦0c÷ˆJùÕ’¯o#ydöJÎÙa¥ŠgØ+9o¹½}Í]ks×êoîZ=Í]묹;¾äZ;°,m|ɵö2ùضʮµý¨ZŽÛSH2$Œû ãžBÂø¬0¹ôr>°°0¹ôr>°Ð09j9=áa2Èð0é/`Jùí[ÆÈ˜Ï&É}z»V©:/¡)Åa£še•ôš»{Ù’óò«q!¯{ÀÄáÏÛøY¯K5šNfÍËj¤md¶vPÌ 0Œ?¿šð;üÈÛsÐbäà˜õ=7‡ôÖÄ-­ðA”w‘§si!ï©kY¤]=ßK`YÝð„z¦GáÕííí^-LKŠ*PsÔ² ŠØ–}WKýhòÑ妤{†®Ìl¼BYM…¬«æ*è5!ûä B°V Øl äò\žës$ÖÊÇDŽ"êE’çO5J#•Ša+£óCF­›K¶eÍ…4ñæc©Z†q­SÍ`qÍ˜êÆ„ß^{jÁWQ2…™öæõ˜,&W¹ÒMì)ë÷b”Rô¢ xÛµšÏ‹‚IÙ‹PÛqÏŸ¿Zÿþ3˼b’ß®—ö¯U%+bM|WøzÜcÝ %tQ¨¾ˆ,ïRe©& &o¨ÏüE ¿GûV5Áw ×,nê>D«‚ÐÛ™~zsV¢7ÿOVÿPKƒˆñD „aPK—pä4r7-(77meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-8825pc092006-07-04T10:45:04H.Merijn Brand2006-07-04T16:04:452006-07-04T16:01:26en-US2PT3M19SPK—pä4Thumbnails/thumbnail.pngí—‡3Ü÷C âQ#ê"¢÷,у艶X5DoÁj=z «D‰½—h«,Q6J°zßÅêÝ*o~3ï?ñμwæÞ3sçÌ9ß™;÷œó‰ÑÓQ'{ÌøøÞ½{d¯T þÙè;ŸøÑ¿“Kqïkµ†Šâø®…³ÍôW¹ †v“WJÄlú”ý¡_IÐ3/¡Š³]F"öѱáüB<¯¥uô£ÒëóüÛÑÚRÂLf€áŽæã8Aîï3§jˆ B»aeÇÑG¦“|"bOÑ‹j zq_Y.QSrMY{-Y—›£-%û7s)ŹFQúLaH#·n®ËÂi´‰•©WQmXô»ÖÓ³ÂÉÔ×'É7ÓµjÓX÷\þñ¼Ç„¹¥eb*õHWÌn‘÷ãÉîyûnì#üé½ÊbT׸:n¢D×öoÙÛ‹Íl÷j»AjWW‹Î²@Ø&ÉEÁሀSçjÂU¢IÆ­a~–*¨‡ªH˜ºÏ›­gzd÷U„ƒÓŽ[3ç^¸1Œe[¶N"N¶$¹t´¶º¤ ]æ whÏö‰²²oH6Vz°8\ïj_Üá^Û~Ae%ùP¦0ÆÏg¥8ÓñDõ¨Ü²=kIN”/ÛËÆØˆ”öf”फ़™y a<3iQ1ÁÛ·/}%E^\,\íe¨NoZÙØ<ïg¿ODžßÖŽaçåø’ƒ›ÜúÎvçj\ç$!Õ eU±ù‘ãîüMÓÁ¦Þ+ÔR·zÌÔ`Ev6Ü¿ ƒ óÅn…#G¡æÞÚ¾Ð_iÑÕ<ÉúgÕ¤s‘í¾-~ˆ‚M¯ w\(íêæ‚bô Õ¬'¾kÏ´x—”e‹;“³€><—(Nê£iºCn¥ý î/áYæ–RSƒ±”ÕŽ)‹u¤úfeêJ!&”TiêÞ (Ÿf~þü­ªŠ¢Ém1çÞ9RçPRI "Ž’ïÊ/Éh~ƽO—øí›-üJ;¦$B«œÐ|®òî{$“K}u /o–‰ô“‡¨+÷£’'Épx¼a‰ŽõÞ|K™mvwWÕÈ(C&W.ÐwRÒ~ݤ†Ðl©°Ù%­5=ôŠmŠ’ðnô—w÷þ£Ã8ìàúoUH1##ñƒr=»óóóµh…ëoW6h`ìE®ÓËsE“[äŸ`ºg‘ÿ.+æÅZF|¶¯Z6k{%bdNEãÃè õTv÷ýöÓçhòµs…×C; ‘°4ØA8ë›óλ›W ‚`Ÿ‰Aéãlb³Wž]+\Ȯ̀Štl%¸BZ4òœº{µýƒ’ãyN^r²•gÜBîYÿ‚‚”'G|,ë¡ßü¼6™?ù_{‰|ínèš„§ðAïpyrÚùW‡ü^@¿•kÌÄ1GãÐëÏ"»õùÓj Ö¦¶æ¯ó w@Ø-‰·½5 ’£ÿ†LØØÕÿ¹Ê@~Å~zÙÒÂÀðûsÃ/x5¦¡ ÉLŠ•ü„ŠãÿMÂCŸ—ÙXï"?Qÿ­XàyžÁöƒxÿ,ŠÞY¦}ž!¾¦_´?Výßý~˜£‘ª]¼Š‹ 4CÅË3:BÌë•Àɤ§ ÄfâoÃŽ`ͦ:/_ö”Í? VFÃ`4 w÷ô_APÆ ’’LbÒG×~“÷͉¶>Fš<é.ý&U¢ýB‹ô;m«¦Jˆ!¥Ï W5>Ú‘°wk$ª€­-1éY¹i+·ö8Ë eœmˆÈ8‚²¾xû¦åu»»Áo¬=Ö¾‰ÞU¼ßÉ˦¼îŸhñ~>ûxû>¼Ö Tu[ß«CxeŽöœèOÀ /¹ó­Üvœ»efsë ¢¼··Ùá¾¨È ’ž¤çñ<Ùâ?X*ýWœ½õúŸY)ÂŽr,ñó˜'ZwJ¨|ùŒ ó÷C1¯£–¥uÚF Fʪ“ßÙ[ÿa$@)¬Ž`©ˆgk°®+çF샓úx_*ݳwø=P’p’îóP˜Sƒ^sXóÝwý犆#åÙÌhØœ”_p¨3ó V _Dm:ŽgÈ&ízâ†h1¥Ðì•AC -r™çž\Ì¿ŒX‘–øRF[õÎÞ±íá“‹•¶Š:Áw¹÷á:C£Ø¼œ\„âhKºH hvtˆïÜå*ÿZm ”gµh¢±{;i„<_Þ|̽eIå{ f™ûÕ øEwcÊãÍâ›bˆ‚·žxg,ÝP»i QOHQ;…I¼üËÅ£©ëöŽâÀ¤¬+ü§ðÜ& &È•zêb‚ÜDŒ ħF,J€´¤ÞÿÚ®@C$¥;úŸ$±#ø0JRºýGà.ýÂh@æh¸­Ôw.vžã¹ÚÒ¡dzúO:XÛæ$Û:,âñÕÐö+¥ü ï!H·N÷º%ÁÞÌææÿˆ[~µÞ®ËžË/¯JÐmJ²$fbRÖJ}ÂÍîvK²UÕ£kjÖ‹ürm+êe¬ùXèã!›†§þ¼*®ôƒÿÑwãù`‚Ý`í°BÏ}[P6Ÿ]‚XÊ{€¨‰Y¤m¾UŽ6WNf¸R/'Á&×Ë-G . Ý€nƒIëV³7šŠtÕ›ÄwŸ×œºœpH–­Ôõ® ÿÉ;‡•<+IØC¹šRuàS—7®ýå7]ô¬¾OçY*Ý[nYd¹c“EÀ(–ç©´ÏH€ä(y\êZë–IËûÙ’Ë,;J+±úîÝOã´µ˜ÛfâïÅ[üUe=n-›ÂdKuHƒÌ©/Ó[¸ýØÈvýµUÓâ“%9 M>Å (S%zÚñv¤È¥ë8ØÓY|P{B`¡MÚÔ©"¢m+ŠH«A•ÃÙäf/P'"(çé²>ƒ¾àÂȂçsR¨÷ï×/¾Zà:]q–³æ?zkPgKÙõZ‰yGHÕꆿˆ½IŽ’’Kƒµ“²Ê´À0z/Ý=%~±&¦ wRd,Mú·ôIð—âñz‚‡³×ÜíU†L^9–0ìÚÖ¹*¯ÈìàïÁXv~î=Çèè0`ÙÄh´ÇXðúh~V3ÑÏÝêîoÍ×ûlPæçÚ»J ï7Õõˆ»Õé"C«³V“ñ1ÚÖ9ú1õí¢ÿÁ-™p…¢K‘ŠG;+A`rñ–ÝÅëT“Ûç7„’@6¸¿5YDþ†LÙ…Î2ìêj¦Z1N Hù†Ýk >¾Î^úõªMñAx°Óç4ÏQ7g¼pÌ¿´ß‚L%ÅŽ~nðÀÙŸ‘5 Ü‘—‰ŒQ…¿ý¥í4 3kx×[}ˆ«#ñßo§ôòZæ' Ù›VúYDÜêŸØ-$mSï"’´lí¶ŽÞ³º“ÓjÛcaÒÆ,ÕÚ¬!Äef2‡úc1‹_0å4´„Mnîí¯qNµBG®áÁ8“á÷ Ç\Žmb€«3J·³ù^ð[÷o¸¼¡I‰øU†> ï%½æ÷ÌeT‰­w”“—é×Èßš-%}aI›‹Oq/Lì±,«¾is`\§ØìÏ¢›=ûH}1˜s=¾ —œp,ø_h‘«Ÿ_ÏGÁÒKkpè=¯áÉmýDkÕ|kõïÇ{üŸ«~´ïSbHbš½ emÀ6~ýp®Âü.d&…K‹CŠÚËŽª{ ¯w…D"k¬ŸdJÆäáwùeô 8š±l1iߺý®Cèaeõ}±æ~£B̈E›þÕNÈ¿ëùË×£òÈyÞN²ç'^‚ÊŶ}ø}ð ;òj[U)¬âZtðþYš î»;qîʪ´Z9¸lß÷°¬*yð™ÃÕ”À­F*`¦ï­û»Âó°§ÉIf~Sœ 0•Ý(äÞ§¬·ì±X\ ûÂù$yµz× ÌÄŠÆy·™ìWPYîÒÒèNàcIÙ]šL–üÍô™írç„ÓÖ`—ä¸íà_¶õ^½S–•Ãw^So•Q¶¶—œï¯ÁOÏÑ×cΟû›¾8+Œ “ê¾­êé.û†WU)ë&°*vdá®;í»ò©?ÓLX:óX‹…«ï@"s¦õiAZѽû-#ÄûXÎ,{=Ÿ‹¹fñê,¥*N A·øx³VkÄÓùfQÚ骒1ŠR%CCI·%–Çw¢÷+œò€‘›ÈF/ò ¢Ù3üzéÕÞÊZ é˜úJ‹—Þ¸%Fõ€Û£ó¨oëp J1F/Òò˜=&·¥µè-e/‡Ÿþíqð£©L¥Ô³Ð´ù‚6´Aƒ³|HR­ Bž”ëqVåÈ’Eª8ƒNDTšÏ.á¤ä¦ÛŠnsSOæO¯Òw´W˜,|ÅéÅÃgM,0œw'}t´u¤t4XhÒˆ£Ô›Uµ7¾­ÿÝW‰@¤}xf™t‹¥^ 28ŸCi®ö¬Ÿ ‹V3_ P© ë|ݪ¢GÏdÃôü+RŽ'ÈyïðèHá+6Üû²Ã0H×G \¦Š Ÿ¿KÇ;•ˆÞiQÇšÓ¥>Q’8v)©#ÛpQ·>&{Sw‚eΨ?±Ï _êìšv}Í¢jY_68n5*Ül19èi»M™ŸœqÙ¬õ7žN‹ÿû ØÍûëH³^*W3)j¹<9p éªá1 _ÿ%OXëÏó/R'Ññ$†_wp3¢‡×ÜÀ …jn§9¹Æë{7WxýŸz ÖÏaaòTvPÿ*~R àÖ‡ )–On»úc¯ïVuATº’ÛE´Ž¥N]›0Ú1ð‹@ rOJØÕDdú##÷|O0!¨Î|f{÷ïÎ<y¯×Zijýª)EŠÜº¾ðvbkٲ÷*Oéí¿î¡Ë~“Ð]eË öôM9hÓF4­ÂK¦¨O€Ìñ%y\•HZaþõo’UòÏükìV¼äú=i²[Ú‚ q˜ãßÅ1~îl`¡µº@iÇJOuX‚Â¤ŽŸ ø?Stèjr¬øïGç’Á]± Ä(, ´ZÌÛ™‹Úà§Ò¾:ÃTqÄZAxY|ȲoÞnDäùšßÁ“…Ô”oW³¶Á‡êè€W‹YKz( ¬ý>sã¤_]=,’†?roÒÉܦôÆ»-;ÓÑTw2»’¼âžæ½K=Ùð[‚’Y™ÄÜõ«s¢Žœ²°Xh „çÃ0â½Å>yì>x2'£N0¤ð訓ÅÑÇt—’bóøÄõ£—ah…Émué“» n| ï5_=„½´f•8Î %[žðAþÉ`@ek ÔݲUÿ±§¾% ¹6VJ¹¾>ïštÿÌ…©ÆÕ¹Üc6 ‚º–™O}ÏW;$U°mT°™îÀèšlãdúÐCSC&Ìf‚ ÂH{!­GqÙΘ‚Å2ã <«”'S+¦1[ª]Sã•!":,Mºß\¦æ®x „“D/c« vɇluìúu}ylâV:š^FÖ–˜˜4Öþ‹²2¤.CÔ·çL*ÁÓ‡ÏâˆKfËÔ¨˜g(L­Ñƒ©I²uß#1,‰_À[Cº~ØO€»ÔùC3·^dl_IÀ6rog„Cú›ôâWºwDá 2û×f.Å%ˆö"æÑœ·±*Ò0ŠÝì'¶‰Ò;ª&Գɮ}CÅ®;%Ýýœó‡G˜ªØ‚ '.f=Ð-ÁÁ—Õ†z½¢DFÆÖUg¥µrAg`hžð¸Â²Bî»?Ý”8îý{ s$8úÞÈ8 …I„íŠK¢7â˜1ÃuJòW×óy·¦Æµ÷´+x¾¡cpè;ç¿§»ážH1+´Í,óL°cøŠ;Σ jn·“¯¿—Ÿ®>Ø ˜bˆ«Ó¾™ |ˆiÏKÁ$¼ –RÁu£š\¹e™{Jˆ®(9†ÌC|·‹yæèø¶ÖeY.spü,uiöàäÑx9/oÃCÖ“-»ö±S™§=ÊŒ¼Jz[÷2ÜpéW¡W:ܲ7ðµ^ciôÙ¿ ÑÐFøó|îð9ƒ¼ÇÿòèøÊÀq>´ÒÒíþÇAtE>e¿´ÞÍ3U^uSL´ìd„+¹X¦ÕZ"‡þ‘wœÎW“pú\\÷ç§÷¼1ŒoëÈÖq¦–{ý¾NRœ‘–“øï›€xÅDc‰Ë€Éd©=ðÏKÛIúR:PV’ØÎÙvðÖ¢ì® ¥üÄq¾z ŸqûƤCóöOÀÙ(0кbì”AÊØi-­\qÍ(çôi¬_o s¸©Ø­ö-JÔ³Ûu|¯Íç‚©Ä(1§úgðÓ¹âc@åÒ°R.c¹!€t)òŸš½UtË×Ͼƒœ'¶cFÒð.žá§4k•™ÉÊó”œx`±ÎÍ2ü|`€íxF,CÅù©œÕÃrê¶^#¿ØÖí4Ac_™½éö0ù±¨cEÌkòˆ¨Jãʬº¬\ÀHÙ•Ô¼ûzYZ"|".|O´»ÿðÁ޹5HKñ0ª’î„c©…õ‘P.û‡u†urTÊ•ÝРNR˜í!}op´÷G$g#ËË…ÓÁ½5k—GCUsg@M»1Ǹ‘q²´ÖUVúÃwËiu})¨ÌoV¾î}Èt¢€I™¥TBÞ§ô\!Ë%ö‹µ¬¾3³`G®ÆŽ’x{ ¤„I2Ñúc”ì×ÿÂÕÆ†\6ô^¬eÂ{eOvhF«Ù$[w‰¹ç9¯.䣔GðÐŒÀ™Œj“ <"f²ÁWò_‘^Ê~zwWqÚ¤r>óô˜’’ÕΠe|­þQ׃Ú}üÿû-hD0IcÀÂäϤ´þ0áYäŒ9EXxbKÏ â3°¥ê;–ï‚GA…7~ÌU¯ñ¯Ú¥8CAIl(AßF¨c)sÅüT§·³dû,ÿ‰/:_ÛôÄwÐShãâ¿$ˆë”rÚ/cÆŽh—Ñq§/xaÝ…NJ¹™VŒDÐE’íd¡NQջΟ™â[ÈŒ ª&u†,FŸü÷äîêY²— I°¥wŒ\Òœ Öz„ŸCWt${òd„ ÿ9»ÁÇøN}¬c¹Oß{àÕ7v}Äjéµ ,ý’ʇëݰR—W&ßóºOvÆãϳzÁ=ÕI$˜ÇEJ‡b­wNôKÝ—lÌ2ˆÄ4Ä«O„gÙBïú,IU qÖPùÙ€ Òù¬Fü¾ôÙ’ö,Š™ [ß:[’<ƒTT}²Õ凎üOéð·Uþ'0³û´×/‹Žæ®˜T;~  ¿ :¾?ä%/-Û—ÿi÷6$ýÆ–÷FìzCB`ž%ò°bM¬_C6àâ®hl ;%Áí|¥D3ÈË&C™f÷Püú#/–ȰHgÓ´3aÕóÄ~þ )³òg„Ç%Îý(Ih‚ú¡ör7p:<•ôVÓkÑ{äò5qDLÿ‰2àýžWÕ¦´8°«&h·œã_±dÍ,×å,°Ö_Mö¼»Ú½‡wgÜuû¿h*«Ú.Ì=€¯Ž¨zh5æR“ûÎø’Ew˜ºôò!«f¤ ¾¨=`Go•S¥¿ÃÖY5黡öćÇerIAùÌ.7ÌNÙowèÆèˆmÖ¢Û¨Vc5«e-ZƒÆÝáœin3Ø 9§ˆŠÌu›ë™ÊH±ݾ¿,\•zfw®óUÍuÆ £f.ŠÙ;¤ò/”-*TŽ¥°)ß§³ÿ;*oÁV³†~|+øì"Mò¡ÿkPOÔa€0€› ‹ò‰vÑÍm²“ø%¯U-AÏ–ÔËÜ–†øÐÜÏ鵎,8³ÆãÅ$f9ÈÒ¼ ¬ˆ/n’U“xZaâù÷ºn£þ’¼ÊX<ÍÈ‘‰°êÜËÿÈæ+ÕJib€P u³g‚¼ÚηÐD:à ü}gÖ³«½ÛÀ_[S‹m¿»SÛžet9­–*éP)­íjþä¿À$òPïiŸÕ¬û³Í2_TðûLªö>Z¹dA[w_]´54<]ëO0DWY6l¤L‹;Œª¶Ÿ78O¯¯ìŠVý™ÆlHÈ1窱íl¿åðû°¢é+ià¾Ô?kfΤÀ’ÆÈ´ïêHéej§X™ÃéH´Å”hl½<-ð^@[À`š˜µÑ{'%w1V¿PfP•¶µ55%g!~®Iý[£ï£þ¤Î¨þ~ Ñ9NeîÆ%æ¨ÞJïêí]0yÏ Žà«µÁhØ.®óÙÈr¡LÄ{s×ùâ òÄ5 £QãͶªGá¬rÝð«´mÆp{ m0à&LéÇ+Þ¤óšð,i4¸¯'éⶺ3½7ó3 iB/ºi2 Tj üs9ÓT3Òí0! HóK&ªärçeâ£_9¥µÞ“rÍÜ.+'î¥@€†”Y°l/$$xCƒ.72·§:¤+¹‘qIµw±3°R\ç1®óõ¤#Ë`v9Ö¨ –J Ûf8}ÎÉùPBBb`xøMá§&,ëò°Û Èô©]PÜ%,8ØéAå J+2sq*ª0M²gqH`ú;ù\)™4äy¬³@í ÁÊ1x”îœ/áæˆlx‡|;qND¹VüÏTFâ`“çÕÉý\”üQøïiÊ\q11 f±7‡Sï}Š‹­DÔ°¡«¶ÆV‘…ª½pÊU„Ö~ºÁ$ÅYIFCxU(ᚓǨ Š£ûëw„)jqàmLm°dôˆ3G~~™¦v°«QáØîä›×ò~£çÊäY¦ëeÅÄJßSÐÎñƙțß>”c`˜ÖÛ0ç—ò/õ¢54”õÜ›·Ë̈þëœKú¸~¡X+³¬ýµø¬âB[$ƒW·—?,¹”ƒf\7ä3¦QëÑÜ}Š ã,«zblÉ‘,™eÌ!›- ;Ð5PšÛw% ûEJ'rºÚ÷é~Ö2ŽTUÀ+:“µ0ùÓ!¡Pmüô0Ù9çW,ç¿o~ÝÓgÈœJÅÖVV&b€!úßÔ ”û7F)‘ u¼Y¢ÍŽ4êñDt¹ ”{Ùç#ÉŸV Ü}™dý‡Ç b3VX‡I$þÍ@J'ÑbwgÅ£¦Ùv¾ÖpÖ±&ìÚš§ôÞt‚é¯ï"©¢C¹ãÿ¬{­—IØÉïëÒ{Òû#>õt=Q<ÊY9ˆøÿ.ÿº\³~ƒ%o°)Ëîý[ª:*•JVaÿPK+Ž\ådéPK—pä4 settings.xmlíZ[SâJ~?¿ÂÊë)åîJÙ ¬ÞVÂEåm’´dt2“š™ð×¥\ áTíÙðd._wfº¿îéäøûÌ#{Sà3z¢•ŠÚP›9˜NN´áàlÿHûÞøç˜=<`ê³¨Ü ¥"öÔt*êq÷‰pZgH`Q§ÈQ—vù@—ÓêoG×Ââ–ÁôéDs¥ôë…B†aå€ñI¡¤ëzaÑ»j3ú€'›ŠŠG¿Å{Mˆ•Y+‹ÕB|­í½(ùniËuXÞ~ãøE@ü³%xÑÚì½4GªhJd}Š!|]5mÕ¼÷sFX`‹€Á ˜¯-;åÜW˜J­Q<.|ùð%<ÈÝ ßbGº« KµoµòÖðÀw¥ê•£š¾)ü¾‡ü}L˜“áêMZÌQæÅç›( a×Ih)$W 5¢ÎÒ—4@zZß)ú~ŠAð„F² ¶.¿aKåw«Ö»šn/ß#ßgˆÜa?3*éûË+æ@r\Æ·0ràÛ»BOh¿\ ,ô­þ;À7l‰§°@7¬Yž”°Ô7câZšëXeKÜl |‰ÚdR2ï À+?§³uÒb„)ΆAj9ƒä ’3ÈßÅ gÊB3âÜ?rþÈùãoãŽ0ŸÂ¾L •œ@rÉ ä¿#uÝ‹Òɦ¿(ª¬©Ú¼VO¶ö ›3B,Ä×Vʾ¦¤1cÞ@ádêÕè‘ ‰3h1­  D…°OÑS‚÷]FšÐÓ ‡¨›À·#€¨Öx@D@z1càl¡¿X'@ò` ük&wÝæ8Y¢Ì9Bª<MXäE¥òa¥\®¥ÌÜßíëV¥ƒ„R=ð¨É øn„ô]©Èfè]ñ3SèÏ=‹чdLÈDHŸ"ÀL$$$7: ÏŠ»â¥ð¿3 &µßëóÃò·” ”„_™$n ß,O±È8½ý¾Zù´¦Ã3,úsj»œQü )ˆ(eBðòÔgõróçzqCÀQ´Á_yÀ—ÇÿYܸÄôiè;HÂú3UÚa’ò”‡¤?#$ýN’HÖBĈ¢ŠìáoÔIUÝǵºXsˆ©¨3Û \9o¬XHÀaµ‰)âs­a† —Øž^5þ€O¯4ê Ÿýêøî| Ÿ½5Œ+ã±_ GMÃpûêï©£¾úžŽÍöYñ¾oÌZ´9G·µâø®«C{4·*“ «rîUÛýé[åª>lës§sÞÅ}YÑíèùfpza—¯]«=Ô¯FØòJ®í9¾å™.¢£g§]"íéW­0¼üaˆ+ôʳ©í™Äî˜ìfÐ-*ÙÏV{T߆úÛ~Ç#ãA1l‘fÏ<½žZÔ$pjºNûô"¥9û>™ðH¢ì͹å"Žles-æùDä÷™W7ºâ85Fô& ¶ Њ’b&Å4…QüFÙOÚ"Lì"„ÄIÈgÞ<ÿ3–ÙBˆAˆJ§":8gV QÈR*†Så;Œ’yŠ{X›Ü>¼ÆWX÷‚cãPK "y.œ")PK—pä4META-INF/manifest.xml­“±nÂ0†wžÂõ»íTY¤•*µ…! Ýø,%g+>#xû¤,m³í_ßç;éÆÓ]Û°-tÁ:Ìùƒ¸ç °tÆbóuñ’=ñéd4¾›/gÅçjÁZ¶‚@ª/Øjýüö:c<“ré—UeK®«¥œsöÞç[ÊÅg¼¿† Oðkfú†Ó1ç±Cåt°A¡n!(*•K.ãÊØ’ú™W‡6&#vW¶,»ýE`¬Îhï!çÚûÆ–šÒä8ºÄ¥Bß6a@ü ©bÓd^Ó&ç’Ë9CD‘úÑŠÒaeëØoÛf—‘ðø[9ÁŽd²Ý†'?z>†äÚ7Ƕ@úÐÛ°bÛ/Ô¶ ’úRx¬‡†;X J{íX^íÔäPKà&ËÊ.ëPK—pä4…l9Š..mimetypePK—pä4TConfigurations2/PK—pä4à·Ý"æ® ‚content.xmlPK—pä4ƒˆñD „a Ýstyles.xmlPK—pä4r7-(77)meta.xmlPK—pä4+Ž\ådé†"Thumbnails/thumbnail.pngPK—pä4 "y.œ") 0Asettings.xmlPK—pä4à&ËÊ.ëFMETA-INF/manifest.xmlPKÞwGSpreadsheet-Read-0.63/files/blank.csv0000644000031300001440000000001411716405376020172 0ustar00merijnusers00000000000000,,, ,,, ,,, Spreadsheet-Read-0.63/files/test.csv0000644000031300001440000000010210701240203020033 0ustar00merijnusers00000000000000A1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.63/files/misc_ws.xls0000644000031300001440000001400011761614021020547 0ustar00merijnusers00000000000000ÐÏࡱá;þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ  !"#$%þÿÿÿ'þÿÿÿþÿÿÿ*+,þÿÿÿ.þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ » Ìá°Áâ\pCalc B°aÀ=œ¯¼=@ 8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ ðÀ à)õÿ ðÀ à,õÿ ðÀ à*õÿ ðÀ à õÿ ðÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ¡misc… E … ÇfooŒ11ÁÁTëjðbð( 3 ð¿ À@@ñ  ÷ü 1 ÿ n cc » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?Uý ìPðHðð0ð( ð ð>¶@ggÿÿÿÿ » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?UìPðH ðð0ð( ð ð>¶@ggÿÿÿÿ » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?U~ ìPðH0ð ð0ð( ð ð >¶@ggÿÿÿÿ þÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0ÄHPp ˆ ”   ¬ ¸éýMicrosoft CorporationMax Maischein1@Ð@@€&\¤iÜ»@¬Âë—>ÍþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýéýRoot EntryÿÿÿÿÿÿÿÿÀFÀ Workbookÿÿÿÿk CompObjÿÿÿÿÿÿÿÿ&IOle ÿÿÿÿÿÿÿÿÿÿÿÿ(SummaryInformation(ÿÿÿÿÿÿÿÿ)ôDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ-tÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.63/files/merged.ods0000644000031300001440000003532312474071347020352 0ustar00merijnusers00000000000000PK“l[F…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK“l[F¼uèYÆÆThumbnails/thumbnail.png‰PNG  IHDRÞÿõÿsIDATxœí]k¨UÕ_×®Z¦¥FiIZT•ˆXd†=À{H“^’if¦–&¤ •™}É‚©/A„ìE=è‹f%J/%‘Dñ™Ïû_Ýõ¿ë¿îš™ßZ{Ÿ³Ï_ùp\wÎìY¿™5gfÖÚûÛ;::Ž?Þ«W/Ó“}µï:ù^èÇ,ß3½ªhÉDJ©#Š#ô3¶µµ9?ˆàEö² bä¬!¬3#Ì‘“CTÔv€º‹Å|ŽŠd’³´»…1„Sz¥2SRÈrè@º _Â"´Ÿ=÷J5{¦œrÊ)nòýؽzmìŒØr`{ƒL¼v,SK&Hc 9-žÓnNtò‰Ð‡×±cÇl Z¦[þÑ£GíŸ[·n=ï¼óìŸö]Ç·w•Ú(.•*¥vçqúF˜-è+•‰˜’B–CÒUø aX¦m ¶··Û?]Àíß¿ÿôÓO·Κ5ëµ×^>|xŸ>},ïÞ½ pJöìÙÓ¯_?{• ͰžJžÉGlo‰×ŽeJcÉi 4'£ÅsÚÙTïTº©ÌÌ/’|²Ç°´{÷î3f 2ä—_~™3gέ·Þºyóæùóç:thäÈ‘“'Oþá‡fuÒ5×\³hÑ¢ƒ6láÂ…¯¼òÊüa3èsÏ=wá…º\+y Ššîy@É®®¦c[Jt€Žsâtû)tÝ÷† lœmÛ¶méÒ¥·Ýv›}½á†¦NjÃÑÆåÍ7ßüôÓO_rÉ%Ó§Oïß¿ÿ¤I“^k×>üðÃcÇŽµ U z+éßÐd=î7ôÕtÅuÈ/ôc–ï™áÞ"D2‘’pêH€âñ›GmÓž-Ígžy¦åìÚµë°c…ß|óMß¾}‡j«ö–-[ÆŒóÙgŸ]{íµ&L°»zõjÇO>ùäõ×_ïPÖTŒœ5„u¦÷LÄô—S‡³+È PÌäóXd…‡½rÚñV²-š)ކD¤é¾ºØà;`ñ¸±ÛÍìØ±ÃæÎìܹÓòG5{öìûî»oÙ²e/¼ðÂ[o½µfÍ[èoºé&[ý§L™òÓO?qÆëÖ­»å–[¾ÿþ{›Ym– bä¬!¬3ÁZšî€W ˜ÙÏ@2‰Ðds™ä¥ÓN9šéÄÈš®FÛuiÒr/^¼bÅŠ÷ßîܹ6æN=õÔ·ß~{Ĉ–ÿꫯ._¾Ü÷o¼ñðáÃv9tèЖ-[f̘ñÅ_lÚ´iÚ´ivÃû×_­^½ºÿþÓ§O·ã 6lݺÕî§NJÞÍ1˜.ŒБ9”c`ÜGš©—¥ÀegÉAÎB¡Ò•£°M÷PfãR ˜ÙÏ@2‰GE2ÉYÒÛ Ó¹E°›Vy=ö˜ÎñãÇÛ±¿ ,_¾|òäÉ·ß~ûúõëçÎ{çwÚx]²dɪU«ìå>ø Û‘† Íšt"ÎI”5 ÷ÑôL¯÷È‘#cÆŒY´h‘ µ¯¿þzöìÙû÷ïôÑG¿üòË‘#GΟ?ߊÙ@üñÇíëÌ™3Ï>ûlûV[g3à·Æìì€Êä\b–8¬@æX?˜%GX…rLŠ…$y#Ç3ÒhÆ^ 9é^³#8±q¹cÇŽØÁÎ;í[¶ ÿúë¯öÝíÛ·ïÛ·Ï–u;¶)ÖŽÝSd~2Íšš5‹eM|†PG×>ß«ëÛ·¯Û õîÝÛl7i‹ûUW]e³æ]wÝecÑ&Q©7n´i²O'…®¤³xP™œKèDìÔT s ¬Ì’£ ¬B9&ÅÆB’¼‘ãi 4c/…œôóšŽ ´råJ˱Áç¶d¿ùæ›ö­eË–ýöÛo§vÚ!C8`ƒÕ2ï¸ãމ'Z1ÊE+³ò%jzQ$™U¾ŠšŽ1³hYðÕÕtlKr-$UésͶ®Ã#”¦sKä65žuÖY÷ý.¸àÓy'º_¿~¦óÔ Ø‰•”r(k‡6t~wÎ1Ûº¾¥à8ÚkäÚkн¦›Ï½‘:v“ù”I^º#2TB¨¼6ßK…ßU #Àe(WÍa¶¦š³c 9³š›žøä‘´Ÿh ¾Krªè(¼ëݲ¨ª¸wý]miÊQÏ MÓ Gõ•ÂÝ»7]Ï 3ù§Í¹i™»víš3gλï¾kº—ø‘°†·u=_×»wïPÏ3Ï<óÈ#\~ùåá÷ß%%Ò¼QÉW® kÃPq„HÓUímÁw´CªçËxÎwß}·råÊ#GŽÌž={ݺuW\qÅĉçÎ{ñÅüñÇwß}÷‚ ®¼òÊcÇŽ…\R$mæËX¿>|xïÞ½v`cÑβqãF Æ"ùàƒÖ¯_?yòä™3gº¯½îWYô‡eð,=ì‡e\®úûï¿çÍ›7kÖ¬>}úØ×—_~yÅŠ«V­²±xÏ=÷ØÈxñÅÏ=÷\ï—¦oƒœ£wìØ±víZkÖ¬y饗&L˜°hÑ¢O?ýôꫯ¾÷Þ{Çß<–¥Û Vmb$[´qGÒÑIx!;qxÊr¢--•‰”Øhûý÷ß·oßþÕW_:thøðá×]wÝG}ôú믿÷Þ{¶ <ØæNÓõ€)«ÄÏBц' ^†µ×ÖñAƒÙÁ¨Q£&Mšd´±h\vÙeçœsŽÿfp¤–Õ&­]¹ˆ¡M® +@½ Žu"±Xd…Çb`géa½¦³mذaçŸþ”)Slj´©Ë¦ÉÍ›7ÛìµdÉ’gŸ}vÛ¶m?ÿüóˆ#úöí‹Û¸Ò½fG'Ùbm ºìÞ½{ß¾}6(÷ìÙcßý矾ýöÛ!C†¸/¼ýÚkU=ï‡e,î¡C‡.]ºô7Þ°ãqãÆmÚ´iÙ²e]tÑ´iÓlÖ|衇æÏŸ¿xñâ1cƸ^³q$¬á6GŽ=ÚlwÏŒ;Ö¦ê'žxâùçŸß¿¿m6<I‰4¯D¸ç%»ºšŽmÎĪzdA·¯×vRøwÞ±‘1£“3üiBI#ýÒK/]¸p¡ØÖÖ½köÕFê‡~ètú¸Ô‚É$géaÛ o›;×l ŽÚº~Ð2†> ¡òöz×»§QýÏvt=@HýS.e6ÂlMÊdÇ@sfÊ4=®×ô¿óõQhº‚&ä`„¥{M#¤(sHjµ×̱¨‡kÒ£5Zƒ(§¢sÍhF\ªô\Ó=×ìqY³èç²Ò¬iÿB®Y“UÕ#ï¡+ t²üRœ„„¢šÅäÆ3³ KÈYCXg²˜C$Ôáì ²3Å#ù<eHkŽg9)~_SBȆ¬|Ôû¬—(TŒœ5„u&‹ÙtJ:c!u‹ø<É$gѬ©Y³ÆY“ugÒW:`/ÇjéŸ!_ ž¤9HÀ¤¬ !g畈Ê$}•D˜éy 5é(ŒrzÞÝ Íš'KÖtÿP§x&}¥ör¬–þò¥1À áI˜ƒLÊú§rv^‰¨LÒWI„™žÇP“ŽÂ(ç¤ø/­ÂB¨°þ*ªy#ÌÖTsv 4gVs£Y3‰fMÉIU²¦QRª%é= If•¯¢¦cÌ,Z|u5ÛR¢t=׌цš½Ld/ë *FÎÂ:“Å"¡gW ˜)Éç!0à¨H&9‹t¥š’îÐ  Âú«¨æ0[SÍÙ1МYÍMO|Ê\Ra!TXÛóF˜­Ùž³c 9s{n´ +Õ–züSîôÁlÌ1MzÊz?¿­O¹›¢O¹-èÙ¨´ c±æt=< 'ÕÃ#?ðy 8*’I΢GîYH2·íUlÒ1f- ¾ºM:¶%¹’*½‡ž…$³ÊWQÓ1f- ¾ºšŽmI®…¤J ºôtjm¨…µ-š)ކD¤áBA28BÅX<!²RðQï³^¢P1rÖÖ™,fÓ=(éŒI„Ô],~àópT$“œEï¡kÖ¬kÖ4JJµ$ M¥š’nƒ´ ×¸ Sx¦ôJe"¦¤åÐt¾¤ÂB¨°~쇤6° å˜xí€9XaÎ%@s2ZrWRª!i¯©½¦öšJJEèß•ÇïÕ«Wô†c²¯ö]'òà ý˜å{¦W "™HI8u$@ñ`„጑Q¼È^ÖTŒœ5„u&‹9DBή +@1S<’ÏC`ÀQ‘Lr–öð*¤6áP“=¦Jže†üèð2ç´,BÅX<!{ÞÙ&œ\†ÚXHP1rÖÖ™,æ u8»‚¬ÅLñH>GE2ÉY4kjÖ¬qÖ4ð<‚=}ÇTfæIHò%Ί"ÉWÖýÔV¡¯0+̹hNF‹çè—}µ×¬k¯É~žÂYÙø|P ˜™ÿY”äK$΢H2Si‰cfѲà«KœØ–äZHª´×Tª)é¹f’Ìm{›tŒ™EË‚¯n“ŽmI®…¤J³¦RMIwèPaýU4š0[Óh²c 9³Ñ4ZÐ3‘hA—LT5¡ kÖÌG¥Y‹iÖÔ¬)rN¨¬i:㔾ݡGîªÈ^ÖTŒœ5„u&‹9DBή +@1S<’ÏC`ÀQ‘Lr=rÏB’Y嫨é3‹–_]MǶ$×BR¥= ‰tÉIU ºfÍ$š5%$UMÈš†«÷žÉ¾í5µ×lA¯©=‰tÉIUs z¡j^"?K|œüYNSªyÑš%Õ_#{&9®æ0[SÍÙ1МYÍfÍL$š5%$Uš55k& éÁYÓ()Õ’44•jJÚkf!Ñ^S2AR¥½¦öš C´×TRj2ih*Õ”44•jJú 1ÚP³—‰ìe= AÅÈYCXg²˜C$Ôáì ²3Å#ù<É$gÑ'²dîªØ aÌ,Z|u;!lKr-$UZЕjJšJ5%ý}ͨ°þ*ÎÛa¶æ¼Í™çíF·Aº ªï68EC3Çãš!°&‡&õˆgJ¯T&bJ YHWáKJ ,„ ëÇ~Hj«Pމטƒæ\4'£ÅsôzTX?öCRX…rL¼vÀ¬0ç 9-ž£YS³f]³f›þ÷©ÝÑêŸÊâ>5ó¿O5JJµ$½Q™…$³­¢ÝĘY´,øêÚMlK‰Í‰ãh¯©½¦öšÚkj¯Y¤×ü'š(˜8}|IEND®B`‚PK“l[F settings.xmlí™ÝoÚ0Àß÷W ¼Óíº5*L”­k·n«í>ÞLr€UÇÙ)ýëç$¤¢i²¦WÓ4^€ØþÝq>߇9~w°Ö„¤ÈûVw¯cµ€{èS>ï[W“Óö[ëÝàÕ1ÎfÔÇG/ €«¶¥ôÙÒ˹t²á¾ î ‘T:œ å9Ï—9›³TXöä–Q~Ó·J…ŽmÇq¼ïÛÝ££#;ͧzÈgt^WT6{S"Þ JdʤÂzÎ}·Zk%7LÓ³¹òŸ?8^ ÈÞÚTAئµ~œ¨Ö·´HgI!¾·šU¶îášk*é”ÁP™`håƒjêAÊ•5èÛ!Ï_ÀL™!§¾Z”¡ß¼Ùß™~t¾(Õ¼§_uñ퀄mÊ}¸¿( âò=J×hï«: C|î´”Jh°‰;tŸ¥i-è9!Ú O)úpÉ #~·†û"!Q\¢¤J{ÿ½ä!ùgù`;ò z‡\憌ª/èCÑú ;ø7E=Sô‚ö¹š<Ÿ›úà=E—ÒÇ„Ï+ÌSû|>„çú6³rì¸*¢ìÈm6vçÔT ƒÁ¿ƒ‰¦4êÑ ôš°¨HMív¶µ™CZÿH?Üî.0þ(h1jOn ”ˆ œ\òp3YT §Q½îÑJã}EBIûΑÇÈØ”ˆêü]?¿þ÷°*Kœè:ææR@RTyÛŒ0YánuÄü©þòùî\‡ÿ•)ôvgð)rB!CQ@3LNP·w¸ßë½>l`_ XåŒH­zð1Æg@|Ý–â.”4èçò[¤t+î*˜"“.3n#B\NÂ Ž‰TPÜè&NV>—ë~Ę„1H½ß•Õ·Žn[F "¾´ßïFSŸ.©¬T¿!x¹òÛºN†ÞR鮸·Èé¼\1°nFË'HPõo²‘ É?çÚá‰?Öá9[™HKd ×ÙÊ7>b(MœŸsù~} ä.ˆ¨Þ¿D|Á‡’~qOE¤¤—jBÐ0 ÙêJ‚xOi>ZŽ´ˆ§}~„A(@&Óx•v©+ÔäÔ‚ŠŠÍДH8<8¡œˆ•e×F}Õ_ÊëàŒ«Ð' N…®G!™þܼ]‡‘Âa^dÿ!˜‚ªKöÊ,ýW'¸ÊцrЋ”1CÆt=™xû'œŽ÷€5/Äp¡a¶š¼ ü&;ÊÕWq[^57W<™ÿ…®Át[e¦4ZJ®± wß»\T–®ö£¿Îìª?¿PKñCgÁ–PK“l[F content.xmlíYßoÛ6~ß_axÀÞhYN²&^’bÃЧÖnØ[A‹”Ì–"’²ÿ~GR¢)ErÕÄÛ‚¡/NL~w÷ñ~ñ˜Ü¾>”|¶£J3)îæéb9ŸQ‘IÂDq7ÿãÃt=}ÿÝ­Ìs–Ñ5‘Y]RaP&…Ÿ3zíwïæµk‰5ÓkKª×&[ËŠŠVj£×Ζ_ÑæOwàXÚЃ™*l±Y¼™nÙci¢ð~ª°Å‚Scñ\N>hŽr ^/+lXÅ3ñùn¾5¦Z'É~¿_ì/RIzss“¸Ý@8 ¸ªVÜ¡H–PN­1¤‹4i±%5x*?‹)‰ºÜP5Ù5ØàGQ­ÕãÚÄœ¦(–éä×®˜œ]»bÄÍÙ«ÉyæÀÝT¹ ÓSå‚IJ%6Û‘ø^'ï`Ó}¼{{Ì+UNµe±WeŠU“éѱ¼”2Pµ¾ØÝÕry™øïz¾WÌPÁ³“ð ó,x\–CN\šÑMùPDÖzD`•øíÖdTõ_ï޾϶´ÄG0û21¡ GÏ(„Ñ“^%ŠVR™à˜|zó…h­·­)ùxë°»-´P„ BÎEmŠíÝßé­§óá&q ¸ŸžH—‰Å„’„p›¿*Âý”ËZß¼3è¡¢ŠÙ-ÌØº£!Î`.Ÿ ²¹Ó" FÏ(o«?iP”¨Ô ô²ZGÒÝ{C•‡iêl¢K’÷5öŠ>Óú ÅöÃï‰ÝCöÚ„‹¡± «ù};ø^ “°ÃŒ€rœQDhÆõý­ïñayæ¿[Þwó_é'üg={T4áV2þp7ÿWRÿaüÂ|ÖQi±¨ mBï™Öóä´Ù· î)ÕÓ¦{¸ÉæcDÅL}|‡sIÿj?Œj×O˜~І–ϱy:=W8žOJIFœ¹ÙÌùgŸÇ¹=Æžc2–ßÍ:®„+›eÈé ‰ï>;'ÊdŒ5ô]?„ „×¥˜·’ñ"ª Ž©2ŒêY.×Eñg´¡PҠКn56ð=#vzX-Òô:+ÿˆÎ875ÆMÉ}¬Ä¬ü–]ÜRVl¡±,WW?‚ñÓ„kM‘¬ +1G±t޹¦_C|uFâ—ׯþ-â{¼],aH¦ U¸ ÈKü¿¾·{¯ò¿pLÒÞ£ÃùÇ aºâØjVuPl‡,xš RPÊ2›é¬3:–Ô‡6Uae_î j[LŽknú9BCb¯„9+Ò²Vö©™³C«F!ŠÃ“´u» Ù^áÊEÆ^VB"û½•"LÑÌïp£‚.é_‹Â> —7, «Mÿé­‚72åìhßïíìA`ÊhåŒ~@[ŸjmXþÐ$Uè‚à4\ãm¯äÞ°Þn>v7¸ßéj³%VˆÓܦtVÇÝæÕׄ}¤Ê^lØm KEì³4Þ·<˜”ÉèåÖll$y8΂ðÇDo)5÷·¾óØI»æÞwšk°mJ† w 4v48Îo æLÄñ†rÝÃØ¬hê‚XQmçÓ€j)ا¤Ÿáü÷XY—ˆ°<§©6Á–‹%<ÌÜùÇy· Ýg£Ì§·oÂÍRœ÷¶¹G“1<&gn Ž ¥±Ý¬*OÕ¶|tÂ1h&ƒ«nÀhø¹?É4P|õPx•¤ËÕe "¾:}=•mÏ0ÜvVíèÐ#ú†èÑôÑQÆ«ãóóš"óPÁº6Prä}óŽÚ<¿®°öø«ŽÔÙzVqu/¤¡²ÂkÓãÈ:$º„‚¦íäéSO¨ûŸÚ%õ—è?"s*q–Q¡„Œ8sŠüSïWÆhàK)žöQÿ­†úÄ·Ä8&Æ ¬$ø|Š«ÎMƒ‰Aãe§Ït‹—c•øtÐê r3Â3B2Ðicå—×W¯–ÿ­sZŒWZ½Ö‰'Òè¯G9é ÑÉÈ[ïÿPK0ègàÌ®PK“l[Fmeta.xmlµTÍoÛ ¿ï¯°X¯6Øùh‚Wk«©‡L=4v‹¼$t,Œ“ô¿ÆvæJ™¶Uªo¼÷ûâžÝœö*:€-¥Ñs”&E ¹Roçèyù5ž ›üÓÌl6’†W{Ð.Þƒc‘§ê’6­9ª¬¦†•²¤ší¡¤ŽSS€î(´¦Á¨©œ”Ô?çhç\A1>Éq»Åét:Å¡ÛA?ãŠÊª€ƒ‚Ú¡Äi’â['ü×P5¶És6ªáMè`—2ÄͺCo­êÒý†©þßcQË?KsïOúôŸ8SpgMñÚ;fÁÿ}ÒøÍ3Å—~‰ù/PK2ô \PPK“l[F styles.xmlí\ïŽÛ6ÿ~Oa(¸¢N–d¯w×»+Š+AÚ»¯W¢e¶”(PÔz7ïyúT÷$7¤$Zÿ-ÛÚÜ6 ’ˆg~óãpè5u÷ö) “GÌcÂÂ{Ã™ÚÆ‡.óHèßÿþé{óÖx»þËÛlˆ‹Ws“‡ÂŒÅ3Åñ‡ñ*í¼7®ŠI¼ Q€ã•pW,Âa>hU”^©©Ò¥¬ïp%\-ð“è;XÊ–Æ¢‡þ3+áâh£]ßÁR0-ß°¾ƒŸbjn˜é² B‚T¬x¢$üõÞØ ­,k·ÛMwó)ã¾å,—KKõjƒ]-%œ*)ϵ0År²Ør¦Ž•ËX ¾öIÙ¢Ia<`Þ$P-ªÇ1ˆ€»’—ýÇ”øõè÷fף߳»E¼7Ï”p™*s¯?Uæ^ql€Ä¶%¾·Ö{èT½·çúÎ%eKP¹œD½ÝL¥‹ãcÚT9 ]ìÊÜ™m_YésAz×)¾ãD`^w;Å]D]8 š@9Ç ?JÊçÒ\:ݪyaq1.´!›þÉЙ饺m_ª²7õ¹ç5Š‚9s –-,ó‘àÝ›R.ëÆi)¡bþêàØ–”ÑKàÝ'[îëí`Ã’ÐK—] ~Š0'² Q5lUÒPd e'¨Ìö‚†ÒRã¹hÂî§O–ì3å6‰.ÓRØýfÆ:ßê6 ¶¹ r±éa—Æë»4EéæIú,»7¾Ã¿ ÿ$“QŒ‚’‹„>ß_¡ˆÅßdÒcRR)eM‡à%°<Þ‘86¬îißH³ ¤î©+r½§/JDD¸†'ŠCLû;ˆÑƒòöŽ©Ÿcƒsæ. í ŽóâŒxjºÉ÷ˆÒäþÚn[]v0­6~gíie—ûâá JhVïåš3[U.1]L©‘‹Gˆ#Ÿ£hkF² ŠÄ´ ¤A ‹LÄ…²^„õ¶pƒ=prYÖ*C[ø¾a+ŠB?A>ô†T5¸9û>¼3ª*LHØ(¬1D åŠr™ÏÛ¼'Ó˜wüóC]¯¬(~ªð[«ÔÝ[RUª»~ø ÂÓ€ûú.-¨²ºªŒ˜¶QšdO M ìÃ8øDÄ€»š¨A§Öá&œÃ1à¹i*DZ?Ú¹ŒB™ËDà%ÒkÆ“ó˜vó'ÓÚ9㫉€õB¤¼9›”·c!å0µÕ€¤¼½L^ˆi·g3mù'ÓÚqú5)—=HéɳB3ðŽ}õ<ô|À¹/Šm?ÑgŒtZÎ{7zy漸g“BO‚h¿¸ü=Ý·Ù—óíD‹ç'Xü ·@çê“_äÔÝ’µP`FÁ©çkÇYŒÅ½“>Txy|N9û †Ï‰6uŠ]L;œîJ-§T©¯¼…õ`ëàÔiÈv5˜3duÚ]QíôíU~¾¢‹/S4:}ŠÆNÀfí?'ÃqevTÅ|üQåri5³Ï¦•ój´Û xvÊqå5\|!®8gseöÇåÊQÇ¿¡SШi5;›Vó¡?£«Æ=ýÂÚ†PjÊ/Š"W`.…Û/tœtþ  Vy}ˆ³‚˜zyWTîisr(gŠsAò8øÝ/åÊ8ó4ãôPFû(sú);˜%yŠGj‚žä»< 6|ü>ÚU<`*¼<^¦Ã«ÁÓáP@œOùÜyT)ñjÈ”x5XJ¼:3%..°2ÝÑeq•áËœxÎq¼•áð_0ªý °L{ÊÀF•iCfÚÅ`™vqf¦ü ©¯T3.Û^_hñ9ºŒ{=òâó’²îÉ_ªKÖ½2ë^–u¯Û³n:®ïÒ‹fúF[ûݾ}SýŽgé­{QâƒÁ! ±^-RÒÖe}LÖqë¯ð¹´­~ÕnÛUîÛ€®ÛjU1ù ³8N$j“ë+„÷9k3dÒ§ßëÌ5´ÝîÌûõÏ¢„ô#höF_?,_a®Y£åŽGw?¶~«X¨û•‰ûK¨û ÇÝÌÍz"Äõ+KÌ2ë;8˜š'{ï "€»n®O '¡‡9%!ÎebF‰×"²#ž|…Jk‘ȯ&Uÿßsq‡‰¿rÝPïXpf'¡SV½i œjœBö«Oý/Œäëc† LGÒQª¤bÆ,áòFñ†<åÊ9Ž0Ò»B~9N›ÝxS ß+½7\ˆyg¦*f‹k¹¾Z˜s^03D“ ÍÃq\}iþÒ®iU.Šg’Ü vͼ#·ÈÇ&EÏ,%ŸÞGc45\'<†f)’nlÀ’„‰Nvò=!à£0O~Š›âa¶-°/OJmÆ Â•˜ÊZh›ÅÉžÞÈ+êªqz(ÞÈör#Ϥ˭éN'•ä÷Ü­v‹2S^ßJÁ¢ËæXµ0õï¬_x/"v²çqO’o6½ZFà­Lø]£€@„¼ô½YöÔvnóQ°ÉËCJèåIþkËß‚Tç>®ñ¤æéø‰4R¼`õü«•c¾ÞôgÎÔ¶Ì9Õ‘ƒ=[No\]ÑAj3åÛ˜PÇÛl ‡2“q²–|GDÔw¦K{ÑL↮4®Îôææ¶1¶º§hˆ2?‹ª€eÚ?AÇpÀ`'(¶í¿v¥íâ„ G¾H+ždoO‹'ìáìBÃgÌ™©ŽEñø’Åï,Ñ[­;|Ö X«Ðû~Ö(5u8‹‹¨¡0HYßÉÒkeÿÆ[ŒSéõÛ·oï¬jcÖUÂP["——¸$ŽÀ†Z‘˜b£gÿ(}Éöd_;ù|…¶š ¹ªè&X5Aû){IY²³²yµì˲Ot$Ø“¯S9A-ФÏßÔ€(ÍTjR¬­Ì.¿ÂÞzÓJ“$UÛY˜öÌœÝkÛ6ÕÛά‚ë¿MrƒÁzÛ^©?Úè&ú”íûbœšXEAõ!Ùz¹, ¦m_„{ÒåóÏ‹ÍÏÿ ÈÓ{X¦Ý¬Ê•„É:¯õ²ÇÆ —Ðñ8YÍYÑj~…êúÿPKP£zÔ ‚UPK“l[F manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšó‹ÐÆÞáØ‰í{û*6ëÅ*të³ÑÔ>¤‹Û‰’QGCŽ4š¤Ùê˜ûhKdý½^Ÿ˜.Þ€¥X/š+ßà<´µ?¯ÕCñ¾M†wP÷@®á½3-t¤ä5\ËÔ{y,ouJJLO;jŽ”í®„O4Γâ³)Žw¤¸`FPS~ sÝ É:Ï;È VSz°ÈÓù€ÍÃA‰?ƒsLæ~øÃ ªUO³9Þ"n,ùAKe¬ÕYÙ’óï;ø×_œ$È⤽E˜ÈWêÇW°þPKBÙdŽ EPK“l[F…l9Š..mimetypePK“l[F¼uèYÆÆTThumbnails/thumbnail.pngPK“l[FñCgÁ– Psettings.xmlPK“l[F0ègàÌ® Kcontent.xmlPK“l[F2ô \PP%meta.xmlPK“l[FP£zÔ ‚U ‡'styles.xmlPK“l[F´÷hÒƒ “1manifest.rdfPK“l[FÒ2Configurations2/images/Bitmaps/PK“l[F3Configurations2/toolpanel/PK“l[FG3Configurations2/progressbar/PK“l[F'3Configurations2/accelerator/current.xmlPK“l[FØ3Configurations2/floater/PK“l[F4Configurations2/statusbar/PK“l[FF4Configurations2/toolbar/PK“l[F|4Configurations2/popupmenu/PK“l[F´4Configurations2/menubar/PK“l[FBÙdŽ Eê4META-INF/manifest.xmlPKpM6Spreadsheet-Read-0.63/files/empty.csv0000644000031300001440000000000010701240352020214 0ustar00merijnusers00000000000000Spreadsheet-Read-0.63/files/test.ods0000644000031300001440000001562510327656236020072 0ustar00merijnusers00000000000000PKyTZ3…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKyTZ3Configurations2/PKyTZ3 Pictures/PKyTZ3 content.xmlÕZÝoÛ6ß_!xÀÞhYvÒÆ^ì¢öÒ{+hвˆJ¤@R±½¿~GR’i[rå$õº"Hâ»ß}ðîxw zûf“gÁ#•Š >DÃÑ  œˆ˜ñÕ|ðåóèfðfñË­HFè,¤Ì)׈®ágÒ\Íw>(%Ÿ ¬˜šqœS5Ód& Êk©™žY[Ž¢ô6ë-nÁ¾´¦ÝWØ`÷dñ²¿e ö¥c‰×}… ‚ê‹'¢¯ðFe(õ¼Àšx±Éÿ6¤Z³0\¯×Ãõd(ä*Œ¦Óih¹Ã¤Á¥Ì,*&!ͨ1¦Âh…56§÷õÏ`}—x™/©ì¬ñQVÕãªwE<®:BCR,{׆ï§w÷Oï$öes¬ÓŽœÜ„÷À´ßîïvµ ó¾¶ v/TD²¢÷1Ú—B4®wA­»ãÑè*tŸ=ôú$|-™¦Òƒ““p‚3ÒD\ämA\ÑGS¦Má›@¨qèØ XŪÿ¾¿{ )Íñ̾FŒ+¹‰LÕÒöúè¢nš.à*l 4O”`BQLI¦·®ørà>›$Îï˜VZRœQ‰ƒÌU4 äk|βí|ð.„ú½ìƒÀ³Q0M 8±d¦£ ÂÓÜ•„ÅX®»{Ì'›øÈòe©¬¿Á]÷ñö`Ï?Øgœ “ó#k ãɪ[ñ̤9´¢œJ7J­™z¹˜?9äOr+캗â¯AVOsCì÷½C5Æ*¿í”†y•9Ô’>úÔŒª ³%„þZRè Ð˜®5Vð5‹M/‡¯^ç¹õßs§Û7Ùå›ëÇ€â{åX†˜R¶J¡µ_ ¯'`û´¿¥¢Hšå8C¾°–%íï¶Æín×Äf5•¨À+ŠœÄšà2ÓgòÎ㧘©"ÃÛÊŸJ›°¡\Ä )“H/û»º’G®®$.RF_ªÏ¾7fƒSÈop hàfAx+!^)űú:}¥G˜¦ L޹æ’Yxœ)Z–ep!DÆbbŠPò×þ‘‘Mic³p#- ˜UžkâRhmÆâ!=£‰>¦J—ò¨qS¥8¶›Å1å{D×MQ6ÇøšµõYCq ލ‚ßàÎ2I‰¶óÎVaï´}:ÊZ%¶™jòÖPŽï…Ùᑱ¨ l^\ð¦œ`Ù¥ÈÞC—pÚ ÍTï®AZívD©Î&³ËÚÒ©å*EÕÆ÷Åv·Ö^ ù²LÅþf4*´¥e˜¯Jpl>0‰%×âóåÁª-¹ÓÙzSçÙ÷À2JSi}Ýó±V·®šÄ~´$]ÐÌ£ñR”ª;]È&TÌ[FþfÂRÃ\pªäVñ©yþQ«Pµ±vQÛqý³za8°¾›WFF7kõ¼µúÞpÛ¼oezþ{ü®t@l¦h^¤ØÝ‘I3F¯:Òm‘RŽuSûG÷;ì×c)âín .¤i°)¥zqë&‚ý^MwQ ªÁÑÜ¡½±äÈ…d\×^y[5lû}íJàí£šËë˜E KL[ñª\›óynUËB‹'v稜¶ïÜ ª †…€ÁCãªFÄn6€€Öïk©‡æU˜C-&Í*qàèkž8+án @Â& ]΀Í_:ŠÅÛè6¬~…_Uªªß†7ÃéÔ¼– ­~|¿N^×4ØÊ®£aôªþ ›ýèèuU¨jó&C ¶…_‰.nc2#°Xi!Þ¿» ½Ï†CI/Æ£Ñ5‚¯hüy4šÙ/ ´Ì*EýqpºÅG¡iàO⣀]¤ŽÚo,¼ÿ8wÃoãq£ójˆG*iŒ¾ÓÍ~ž{‰*Ž®‡£éÿ¼Œ½…ëGaÛ®Çó&ð³+ÿòµ1…–7îY ö?®I¯|‡çizf³lmD—¾û‹ZØö~÷^øõ§Ãÿ°øPKRºØå5_ PKyTZ3 styles.xmlÝYÝnÛ6¾ßS*P´ÀdIÎÒ&n¬`Å0ì"-Šþì¶ %J&J‘IÙI/÷<{ª=ÉI‰–,ÉÑÒn+šItø~ççȹº¾-©·ÃBÎÖ~¼ˆ|³”g„kÿÃû_ƒ ÿ:ùáŠç9Iñ*ãi]b¦©î(–(3¹²‹k¿lÅ‘$rÅP‰åJ¥+^aÖ*­ºè•qe%ÆØ\uîj+|«æ*klOmæ{6à®v&Ð~®²Æ§]õœÏU¾•4Èyò²BŠEqK û´ö·JU«0Üï÷‹ýÙ‚‹"Œ///C³êN®ª5¨, 1ÅÚ™ ãE¶Ø+47>í†ÄêrƒÅljBƒ¬Ê]1»"vÅ5é‰ÙµaÀýôžeóÓ{–uuK¤¶9¹_Á¢ùñêæP ¢œëKc{T¥‚T³·iÑ]}ι U+ØjÂ]FÑO¡}î ÷'á{Axzž"š:Æy9FàâÞé2õ½æ é][I{Gåî§¥8ÈpJerekˉ=û¬9Zû/‰’J`Tz¿c¼wˆÉØ÷ ¢Z|IèÝÚŒ*._Œ€í‚ïu|TD¥ûD_~x:‚›:%’`kÄooñÁ.^“rSK¯w3½½ìË7ömy‰F¼¹…›IÄ&ÍêfX(X¹'òëqþ`ÊV8u¹íÝmøÎQM›ŽÞZn‚4/H1¥~ ?ˆ‚JÀyŠÀКJI‰`‚S¹ö—’*$P!PµjEpΫ #R!¦‰8*˃®nÚC5³»Q®s¾¢ˆ5*` 3#HyÍ”€-}xçàÎDlä˜XkªE1Îp»ÖX[:X×­‰âÛ±Ãìl;̘õþ¢NðHæ’+Ût›ÞÛKgÃ’¾#{ ¯y* S¸½Œp` ÆÑˆMg#­…€QñnÌU=µûØq ­YÏYJÔØ1pWn8m£9äŽQ¿ºü½¾ñ“¿þøÓ…vdÄ×E“xfÇw?¬ÚÓ¼´«…àueÆd³­]}fææOÕ»)_Êažz”ç|i_ß+‡]_Á‘kKO‰*w@XF”™vˆÖøÉÓÇ…z±v…‡ªŠ6l½Â<‘+«9ÌÐ/ö°ùÓ7d8­üËÓºž»%ÝËUÐ÷{¢8ÌUÓ¼C…(I[{\³ x À-FrJ² ÈždzpEµâˆ¦Só·ïbØcRla…Ê:÷Ô=ÌZr–b§O¬~‘¤ûT^~ÃH¿è~ÄœhŒ†BHLÁÉk¡[\Nn[ãWi2á˜0 /GTâ{Z'P~0ºöSP„™{²eº*!Ÿu{}V)ªr¾,™ £ñƒ(mÓ1kÖ §öìS%•\!- àþÓ›ºŒ†¡ë7q¸DÄ'¸¾ÌßÖùÏBðý"—ÑGØ€Yƒ™î´»àã5côŽàýK½9ò"oyg‘•Ëcƒ,ˆµl»Œ>w'³vkõiƒF’ýѬңxçµê‘\•±?‚’¤_ŀРä¨Q¨Í¡Fô>M½'Ë9‡r:* }“o›¢x¾8aD3b$ X¡8yÔ ‹>’n¸RúEo¹8·c^8PÉ$ ¤ÃûÑ„ƒ ÜŸ¸å÷“8½°á"ÓôD‹‹‹²ôLgñEæË*”Ù£E|Ñ*¡ô“nü,k›É£4Òߎ›ÆŠjd°Ïo¾ˆ¾M¶î/èpòŽjJ$ y˜ÑŒP[:5EuÏÀðj³Ñ'WæCÛªù-·[pr}}} IuÄÁQÚu]#17ü íZjœ÷7z+̓ŽÚŽIÜúëÈ!´¦zœŸ !Ðx³oqÅÅIb—bÛñ£ÐSÇó¹öžXœ"Šv!öù逇ž§žÈŸ#ï0ÍáÉÁÆE Ìð-ŠÎ¡ßËg~Gáò™þàð¼‰B“½6`ˆ>^®ÎÎWç‘ z¬zúñýo%å…] y‘K./»@+û—J/?ëáø…’¿PK#¬}LäUPKyTZ30W+  meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKyTZ3Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Òå@¼€ƒ Hš1}–e`` õtq ©˜óöÖÁ¬C"¹~þß¶U¡EåîUó‚âsËîö>îýè[Pm7?¾ÿøãçç?4}±õÙïÿ/·._{ëõ¶øŠÿIjqG²{¿ÿÒÖÛàù{ï>Ÿ7å·õ÷|º|úÿïÞjkÑÊzÓéö[ÃÕ¾í^[|ÿõ=ÅW«öæMî6|]=o—o\íý{ƒm^šèÊ/ßå‹¿¨mõÿòYÓÔ—?Û-Ó¶sδ¹ÅÒ~—?=1Ì(Úkm¤Û®;{Zx¤áRùùºþ{{/Ú÷ùè•Y¿W¿Ö«Ýv&ýoe´^ôÞã+¿N÷=½zÍûS ¾JùœN<-—ã;A8ü˪Òp ßӓ7/ÿeýAïóÑ̨y6\¾ò¼}¯Žï;YùkºÄåíÇvÿ±x_v~ÚiÃ~ æGmÒjy3vŒ2ˆeÜO^l”Éx‡!01xºú¹¬sJhPK‹g3ºxŽPKyTZ3 settings.xmlíZÛrâ8}߯ üº•`L&S S† —\Á˜Kx“mk%—$càëGÆ0•xp†€ÙÚÙ‚—`]ÎiK­ÓÝ"×_ç>.Ì ãˆ’¥t®*Hê"2¹QúVãìJùZýëš¾¾"V\ê„>$âŒC!ä^Ó ¯$Ý7JÈH…Žx…òŠp*4€d3­òvteE–´Ì1"ÓÅ"¨‹QGåsÊ&Å’®ëÅUïf¨CÉ+šìJ•Œ~KE)ýIOHŒY‘iªzQLž•ÂÚÈwKSÝ¬Ãæõ«×k‚äÏÐצ°nŽM»Q$ee†`ôsÕ”móÞÏ Žl EeÓ)ìDD(Uõºø+ȧ€à«8ò¹ÂÛ­«eí`ôDo«å¥+õrWø3gˆ¸pÝ4Œ¶ïÑjŽô.¶ØÅ`µÝ”•\0éJ5î,}ÊÒ4e§ä‚üÎÐ÷SzP>º…ž¡ØÁ ë!ã”u(GB‚QŽÎòù%GäehI‰¸`$© Ó›àQv€›C&s,ô”õ›Ê󘾵ÿø†#Ð ®ÐM@&˳§ lìÍYº6°f–°ˆ›¯„oPkTêxKãÇŠ–)#±~”þëR> ÈI@Nòï HV÷*wÙuãWYMFÚ”èÎÁÃac°Ì4UûgÏ•Sê['×#ƒÓ¨ëŒzOg¡‚_î ÞóhÔd¶>í0W?)|›R Qª¯s¸?Í2º²Ÿg€ÿDű › ¥ëƒcÔ:Å”¥ 1OPI»,kÚ—«¤öõ«Ò\šúĤQ WßG!Y鈚# ·ùs(0"°·ðmŠy¦ãA.$=‹š€ ˜ÞèŒÆóå,û^-X­)Iu¶Z¿~¼ÏO¤\¶à–eir¯¤œgsöÙé"[ÊÅg¼{<¯™q(‡§kʃwªÑhP9]*ÊU½Š&58Rõêc2bgpi,$Qè÷ 0:¡} )×mkM®)– ·®G/qi!°õ  Ü?CÊ`mÒjÚ¤\ry—''bŒÈWš*øãg¿ÛìR‚Ï·š÷CW&§ào¥ìHÆÙû©1 <†ä"í-ààØHÿÚË6¡þqÚX”ÔE몡áà DqÿOÕŽåÕ†N~PKƒÐƒ¸99PKyTZ3…l9Š..mimetypePKyTZ3TConfigurations2/PKyTZ3 ‚Pictures/PKyTZ3RºØå5_ ©content.xmlPKyTZ3#¬}LäU styles.xmlPKyTZ30W+  3 meta.xmlPKyTZ3‹g3ºxŽeThumbnails/thumbnail.pngPKyTZ3ˆ Ï­‘Ê #settings.xmlPKyTZ3ƒÐƒ¸99îMETA-INF/manifest.xmlPK jSpreadsheet-Read-0.63/files/test.txt0000644000031300001440000000010211275744145020104 0ustar00merijnusers00000000000000A1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.63/files/blank.xlsx0000644000031300001440000001073212537000161020366 0ustar00merijnusers00000000000000PK²PÍF _rels/.rels­’ÏJ1‡ï}Š{w¶Dd³½ˆÐ›H}€˜Ìþa7™0u}{ƒZ©¥I~óÍ7CšÝfõŠœGŠFoªZ+ŒŽü{£Ÿ÷ë½kWÍ#ÎVJ$cʪÔÄlô ’n²0Ø\QÂX^:â`¥¹‡dÝd{„m]_ÿdèöˆ©öÞhÞûV‡÷„—°©ëF‡wä^F9ÑâW¢-÷(F/3¼OÏDSU N»l/wù{N(Ö[±àˆq¸T³Œ˜¿u<¹‡r?ç„®þs9¸Fþ¼’MéËhÕÀÑ'h?PKfª‚·à;PK²PÍFdocProps/app.xmlÐMKÄ0໿¢„½¶‰ÝR—%Í¢ˆ§=TñVb2Ý4$Ó¥ûï îž=ïððÎðÝb§â1ï:r[1R€S^wèÈkÿTnH‘P:-'ï #gHd'nøKô"HE\êÈ1l)MêV¦*Ç.'£Vbãúq4 ½š-8¤5c-…ÁiÐeøɯ¸=áQíÕw¿ôÖŸCöï=Ê©7ãô2ðû&£$æãÅÞ|DxþÑhS­«»ª^í›—á}ÓmS\- ¹í'(¤ÍšY¶z˜Í¤ËšÓkÓËÄPKÐA»qãhPK²PÍFdocProps/core.xml}’ßOƒ0Çßý+Hß¡-¸i€%Ó,>lÆDŒÆ·¦ÜX i»±ý÷¶áÔÅ·Þ}¿÷é]¯ñl_•Þ´‘µJ ò@‰:—ªHÐK¶ð§È3–«œ—µ‚À Yz‹†‰ZÓ®ÐV‚ñH&šm¬mÆFl â&påÄu­+n]¨ ÜpñÉ À!!c\å9·w@¿ˆè„ÌÅ€l¶ºì¹ÀPBÊLŠ¿½te®ôÊ…³’öÐÀUëYÜ{#cÛ¶AõV×?Åo«ås?ª/U÷TPŸaB·{ÀŽ×•×èî>[ 4$4ôIèÓÛŒL32}ñ¯úx<×:ͶûÎ0ÄVrUlÝ“¦ªô—½<¤ºe•ÜØ•[ëZB>?¤Á ´üPÞ\»ÝÆø¯c˜ :åþa䓱O£Œ†ŒŒX4¹á èûа“Ý_KiéöÑÏ•~PK4<É^PK²PÍFxl/_rels/workbook.xml.rels­‘MkÃ0 †ïýF÷ÅIcŒ8½ŒA¯ýøÆQâÐÄ6’Öµÿ~.[ eìГÐ×ó¾Hõê4êˆÄC ª¢…ÁÅv½ýîíáVÍ¢Þàh%°«¼Ø€I/Z³ó8Y.bÂ;]¤ÉJN©×ɺƒíQ/ËòIÓœÍS­[´n+P»sÂÿ°c× _£{Ÿ0È Ír‘3ÑRbà+/2ômùå=å?"Ø#ʯƒŸR6w Õ_fïz o Û­P~ìü$óò·™E­¯ÞÝ|PKOðùzÒ%PK²PÍFxl/sharedStrings.xml5ÍA Â0…á½§³·S]ˆH’.O íØšI›™ŠÞÞ¸pùñxü¶{§Ù¼¨HÌìàд`ˆûm~½áÌya¤Ðh`Í_Àñå/Å í³k<£Æ­yã}÷>Ë\Õ@+Üv`ÈS£m…§«=d®³ d|Ôêl™çWY+”á)Â{ûb`]« î±ê[0>± …'ø®Qãe3@ thGû‘JYsÈֻⴎų*|ûÅ¿zÇÙ+b»«„&êy>»‰ÏßZÉâûÈ×à Ú#>Sˆ›‡ÖÅ*éjPp&Èz„Ír~OO™û'µiyîb¾¿* ªÜÅ¿-:X˜o””pnx+¾‡ê–+:ª0Oax^M¡`%}³æ7×ËÛÕíâæòêúòÝÕmœrÄÄ÷‹²°xb6¨zç±MpÎyØ·ùÓ·c5ƒ“ à:ù© ª.$ mvñ z&éXæEv ðè—Ü$ˆUÆo»8z¬!ÙÒÎ8Ëüp–ø[ à(º­zEã…¾£y;£––’WÕÏŽ,MñgaŠë8ùÅõ0Ù”OÄÑ=‘2Þš8_á¶Z,nòÕôÃY4ÁÿéʦÍÑw$ÍìN½RWo‰°ÙÔÊ:Äþ¥o÷1O[æ[jýb¸Nrã,„ÝÚˆˆvˆyjÀl©rêšUT¸Hû¤Cë­P4½ƒÇÀ;Øû¤Þ3¿{-ªçF~k”Ÿv“VÌ6EEs‡mXž. »róø(³©=÷ZóËP䨗³¥ÂN…>Ç™øÝD*™TuM½3>&8cÍ[);žõ[(eZ€$µÙ™Ž)b2Oçy2ºNÿ”ÊPK+ܺÿ?ØPK²PÍF xl/styles.xmlí˜ÑNÛ0†ï÷–ïG’R Li02Mš‚"Mšvá&NbáØ‘íBËÓs§i„6º‹©Ü8þsüßǶêž-KŽ©ÒLŠ)|Œ¨HdÊD>Å÷³øó FÚ‘.âÕø,új³âô® Ô =Å…1ÕÏÓIAK¢dE¼É¤*‰®Ê=])JRm•ÜùþÄ+ 8 Å¢ŒK£Q"€VB®ùž‚8cäp—2+ß®®¯nÏ`/ ½…™Î;! õ3z$ O$— ©|>Åqì×V¤¤.ì’p6WÌŠ)_9yT.ˆÒ0mÇ«³»ƒLä¹b„þÎ ¯[?Æy[¿vBVĪD Ô<ÏV,‚€]á0uÜ¢sEVÁè¨3 n ï\ªvaw8 ¥ŒäR~_MqF¸¦¸•¾Ê'±£ÓÌX±¼°­‘•g!ÆÈÖcljGn }B9¿³[úg¶™½Ðeöz Šº'Åzo©éªâ«XZˆQ ÚuHO:ç,%Þ(ihbêYËQHÖ¨Š=Ú.`NU°®ö–XÉÍ#C—æVâ(àéI‘jb[D&Ò:1¼Ó…bâa&cÖ¾†2U­ Äeò@ӵɂ¥0´é-³A¥üM‚mëÔøª+w+µÞÇÌhoæ 3[Ÿ­½™½™½™½™½™mÌŒwé—rì”›ñN¹í’›ÓÿlÆë^ßÝe¾s¶½Æ/³×λ~þÑú¸Ó{M);HmY'¸£"û©9Å×öóœw*7_0n˜hzÉBÃD.œÖÉ5Ä\ʲ$kJpÔþƒ~ù¿[Ô¤‡š¼µPŠŠdÕ’Ž{¤ñûI=_'=ÚñßÓn¨J`Å[Ðitô6hsd`q½Ís¢PKƒöT|µPK²PÍFxl/workbook.xmlRMoÛ0 ½ïWº/¶³"Hƒ(ÅТhûÀúu¦%:Ö"K†ÄÄí~ýh%î: ‡ž$òQï‘Z_µ¶Or³n¬ÃÇ£!}ÿ:–} NËbó*ûg5èݾ¿æj%p Ùh†õoÔÄŽÀ9) VçåÙTòE ®ä6œ‡ôÃÌx¢ý<»Ó18§$Åý© %«ßCîÆAÝC¦äó“õ& JòŠ^Þ܇|}²†Z^àâËòlÊݠݶ¤ä²:ŸKAPÿ¥ä¢äg‰r“Ììä€ÜoŒØPñÆQÞÙt Ÿš_V£T>o wÎÿ„:ØdkÇŠãÊ2oÍ<3N4lWóü-aäú˰÷,¡5El¾Ã_™í„¿.ç_¡#`‘³²,«Ì; |óPK±WÕÿšÍPK²PÍF[Content_Types].xml½”ÁKÃ0Æïû+J®Ò¦ó "ív<êÀy–˜¼­¡mÞ‹³ûï}©› ÛØðÒPò¾ï÷Þ—j>ô]¶$ë]-¦E)2pÚëÖµxY>ä·b>›TËmʸÖQ-šÔ¤è>€ã•Ç^Eþŵ J·j òº,o¤ö.‚‹yLbV=1­l¡0>ªj!_:’EúŠìþK˜µP!tV«ÈýÉ3¿hùŽ””c 56Ðù7Éx½@H²q‘êNÂùÕÊj`÷ž% ¬4`òÀ–€ÑÂqlíN‡ïgMê#‰C·‹öÃcûæ}›¨ÿ3ƒ©Qæ9"ß%:;j ÊPy‚ÞúH£:’ã2½p/ßþ‡òˆÛ.ÄhzDûÿè!ðZôʺRÉñ¡˜}PKbÃ4WPK²PÍFfª‚·à; _rels/.relsPK²PÍFÐA»qãhdocProps/app.xmlPK²PÍF4<É^:docProps/core.xmlPK²PÍFOðùzÒ%×xl/_rels/workbook.xml.relsPK²PÍF}®‘°ñxl/sharedStrings.xmlPK²PÍF+ܺÿ?ØÄxl/worksheets/sheet1.xmlPK²PÍFƒöT|µ I xl/styles.xmlPK²PÍF±WÕÿšÍ9 xl/workbook.xmlPK²PÍFbÃ4W[Content_Types].xmlPK ?…Spreadsheet-Read-0.63/files/values.xlsx0000644000031300001440000001655611130422501020602 0ustar00merijnusers00000000000000PK!ëzÒ“bÜ[Content_Types].xml ¢Ø( ¬TËNÃ0¼#ñ‘¯(qË!Ô´G¨|€±7UǶ¼ÛÒþ=›„V€J¤ª½$Š¢™{2Û4.[CB|)ÆÅHdàu0Ö/Jñþö”ߊ Iy£\ðPŠ- ˜M//&oÛ˜ñ´ÇRÔDñNJÔ54 ‹ÁóŸ*¤F¦…ŒJ/Õäõht#uðžrj1ÄtòÂ’5ÍU¢gÕ0Ü8IŒýs\0žÈîûÁ–»*Fgµ"V.×ÞüaÍCUY &èUÃ\EvÕ¢È ‘¶ðd*Œ ”Á€Wô ;æ¨ÔÊQö¸azÓ8Œ]gÛé Èî>™~ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!]ÎkHxl/workbook.xmlŒQÉNÃ0½#ñÖÜiÒÐtS“J zA =›xÒXõÙiÿžI¢°Ü8Íêç÷Þl¶­Ø':/­É`:‰¡)¬æ”ÁûÛÓݘܮ¬Á ®èa›ßÞlZëÎÖžŸAB½Ž"_T¨¹ŸØ MJë4TºSäk‡\ø 1h%q<4—„µû†-KYàƒ-& DßW²öoJ©ð0(b¼®_¸&ÞLq… (2˜Qi[üÓpM½k¤ê¦i<‡(ÿùê˜À’7*¼‘¼üJfIÒovV$¶þçQW²ËQaÛ îçdíu¬)°¶Ÿ¥!¥Ó%- ½g”§*d°ŠWqG#ú…ÞûG¿ô‘™^ÜNq1¥;uÖî‰>ån-)q{êwã«‚«‚Ät¡_LÒE’öã=ó/ÿÿPK!UUÇÐ_xl/sharedStrings.xmldÁJC1E÷‚ÿfoóêB´$)"øúñ½±/LÒ̤ؿ7-%.ï™{g†kö?)ªV™,l7(¤9/>?ÞžA±xZ|Ì„ÎȰw÷w†YTÏ[XEÊNkžWLž7¹ õÉw®ÉK—õ ¹Tô ¯ˆ’¢~œ¦'| Psn$^@5 džoÚΈ{Ý-Î苺’ËÑ?÷gúVÆzBpjpéÛˆ‹þ ãàp×#ÄTä”?¸Û’¹Æ®->«œÓ‹%΄ °çëƒÄ?gë¹g´É¬¿Ó²¶ùÿQÍ>ð Ômzþs·ÔßÌ„ŒbXšŠœoº•Añ±'¶k´AíÆ'ˆVµ“§Ýt¡ÜÑ@'·Ç‹ÈZ¥l nÇÍœOø”nìýxêM=v9ŸðKzúåm§júkŠoÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!Ú3ÙÔ¾xl/worksheets/sheet1.xmlŒSÁnÔ0½#ñ–ﬓ…n«U’ªÝm$T œ½É$±êØÁžîÒ¿goCB9p³çͼ÷fÆÎ®õšÁyeMÎÓU˜ÊÖÊ´9ÿþ­|wÅ™Gij©­œ?ƒç×ÅÛ7ÙɺGß #ãsÞ![!|ÕA/ýÊ`i¬ë%ÒÕµÂd=õZ¬“d#z© [÷?¶iT{[=õ`0’8ÐÉ¿ïÔày‘ÕŠ°ÐsÐäü&Ý–k.ŠlT~Ppò³3Cyø *„šÀYhì`ícHüD¡„ý˜e…ê;Ð:çÄÊüÏQ# ˆI¡Èþœ_ÔÊq_«¡‘Oïíé#¨¶C’]¯./&‹{‰²Èœ=1 9òƒ N·²R…à E©,4{,’LI¯:c·s,]bûô_w1úWn”GýIi=± r7Y cxm‘¢Sáû©p´;Ç>,±Ý»Xbû9¶Ybwsìr‰…EM^®&,6g>tôÈQU´¤ÆŒëgø<ÐË7vgÍù§„U ²…ÏÒµÊx¦¡!þ$,‘¹¸ÒxA;Œ#œöNcóMÎú .;ƒ„ —ˆƒÒC½R?!žM‰{†wÀ¹%¾áÊ)^ÿbºèõÒ7A¹“\=>,·7Ùm¾ËUñÛ¸—´ §ÆÉ^Šb}P*úŒ±~Ä= 5ÚÎdyPnÕØó±ÐíÁnXv9›çþûGMðóZËÿÿPK-!ëzÒ“b[Content_Types].xmlPK-!µU0#õL o_rels/.relsPK-!>”—ôº[xl/_rels/workbook.xml.relsPK-!]ÎkHxl/workbook.xmlPK-!UUÇÐ_ xl/sharedStrings.xmlPK-!¡ó¬˜{  xl/styles.xmlPK-!iÀRŠVÉ xl/theme/theme1.xmlPK-!Ú3ÙÔ¾„xl/worksheets/sheet1.xmlPK-!‘Ïà4GVŽdocProps/core.xmlPK-!H뤖 docProps/app.xmlPK €ØSpreadsheet-Read-0.63/files/test_m.csv0000644000031300001440000000005010614362642020370 0ustar00merijnusers00000000000000A1;B1;;D1 A2;B2;; A3;;"C3";D3 A4;B4;C4; Spreadsheet-Read-0.63/files/misc.xls0000644000031300001440000003300010614376235020047 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 1ÍÉ@á°Áâ\ppc09 B°aÀ=œ¯¼=x‡Ì$”8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-¤"$"#,##0_);\("$"#,##0\)!¥"$"#,##0_);[Red]\("$"#,##0\)"¦"$"#,##0.00_);\("$"#,##0.00\)'§""$"#,##0.00_);[Red]\("$"#,##0.00\)7¨2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).©)_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?ª:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6«1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)¬"F"\ #,##0_-;"F"\ #,##0\-#­"F"\ #,##0_-;[Red]"F"\ #,##0\-$®"F"\ #,##0.00_-;"F"\ #,##0.00\-)¯$"F"\ #,##0.00_-;[Red]"F"\ #,##0.00\-;°6_-"F"\ * #,##0_-;_-"F"\ * #,##0\-;_-"F"\ * "-"_-;_-@_-C±>_-"F"\ * #,##0.00_-;_-"F"\ * #,##0.00\-;_-"F"\ * "-"??_-;_-@_-àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à±õÿ øÀ à°õÿ øÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… * misc… a  … h fooŒÁÁ€8üÿ 1ÍÉ@ æ  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿ~ ð?×">¶@ï7 1ÍÉ@   dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U>¶@ï7 1ÍÉ@ $ ^  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿ~ @×">¶@ï7 þÿà…ŸòùOh«‘+'³Ù0°@Hhx œ¨äMicrosoft Corporationpc09Microsoft Excel@€&\¤iÜ»@ÔÎшÇþÿÕÍÕœ.“—+,ù®0Ð PXd lt|„ Œ «äð" misc foo  Werkbladenþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.63/files/Dates.xls0000644000031300001440000004000011057177657020163 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ^ÍÉ@á°Áâ\p H.M. Brand B°aÀ=œ¯¼=<¹F„!8X@"·Ú1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ܼLettrGoth12 BT1, ÿLettrGoth12 BT1,ÜÿLettrGoth12 BT3"¬ "\ #,##0;\-"¬ "\ #,##0="¬ "\ #,##0;[Red]\-"¬ "\ #,##0?"¬ "\ #,##0.00;\-"¬ "\ #,##0.00I""¬ "\ #,##0.00;[Red]\-"¬ "\ #,##0.00q*6_-"¬ "\ * #,##0_-;\-"¬ "\ * #,##0_-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;\-* #,##0_-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;\-"¬ "\ * #,##0.00_-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;\-* #,##0.00_-;_-* "-"??_-;_-@_- ¤yyyymmdd¥ mm\/dd\/yyyy¦ddd\,\ dd\ mmm\ yyyy §m/d/yyàõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ à õÿ øÀ à À à¤À à¤!À à"À à¥#À àÀ à¥À à¤À àÀ à¥À à¤1À à2À à¥3À à À à À àÀ à¦À à§À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`…Ô DateTestŒÁÁ`iü  08 Aug 2008 12 Aug 2008 08 Dec 2008 13 Aug 2008Locale settings on this PCShort: dd-MM-yyyyLong: ddd, dd MMM yyyyDefault format 0x0Eÿ * ^ÍÉ@ &ø  dü©ñÒMbP?_*+‚€%,Áƒ„M’ \\dc242\HoldÜ´ Sï€ ê odXXLetterPRIVâ0''''`4 €\KhC¹¬bPÿÿ`SMTJPDocuColor 242-252-260 PSResolution600dpiEFMMInUseFalseEFMMInsTypeNoneEFMMCoverPrintFrontEFMMTabShiftFalseEFColorModeEFColorModeDEFEFRGBOverrideEFRGBOverrideDEFEFRGBOtherWtPtEFRGBOtherWtPtDEFEFRGBOtherGammaEFRGBOtherGammaDEFEFRGBOtherPhosEFRGBOtherPhosDEFEFColorRendDictEFColorRendDictDEFEFRGBSepEFRGBSepDEFEFSimulationEFSimulationDEFEFSimSpeedEFSimSpeedDEFEFOutProfileEFOutProfileDEFEFSpotColorsEFSpotColorsDEFEFPureBlackEFPureBlackDEFEFBlkOvpCtrlEFBlkOvpCtrlDEFEFCompOverprintFalseEFKOnlyGrayCMYKEFKOnlyGrayCMYKDEFEFKOnlyGrayRGBEFKOnlyGrayRGBDEFEFSubstColorsFalseEFSeparationsFalseEFTrappingFalseEFSortCollateEFStaplerFalseEFOutputBinAutoSelectEFImageAlignFalseEFImageUnitInchesEFFoldFalseEFImageFlagFalseEFOffsetJobsEFOffsetJobsDEFEFPunchEdgeNoneEFPunchHoleTypeNoneEFFaceDownEFFaceDownDEFEFImageSmoothFalseEFBrightness00.00EFImageEnhanceEFImageEnhanceDEFEFCompressionNormalQualityEFCopierModeEFCopierModeDEFEFGlossAdjustFalseEFTextGfxQualNormalEFRasterFalseEFDuplexFalseEFUserRotate180FalseEFRIPBookletFalseEFBookCoverTrayEFBookCoverTrayDEFEFBookFrCoverNoneEFBookBkCoverNoneEFCopierBookletFalseEFCenteringMiddleEFBookletCreepFalseEFBookletReduceTrueEFManualDuplexFalseEFMediaTypeAnyInputSlotAutoSelectEFTrayAlignmentFalseEFSlipsheetFalseEFSlipsheetSizeLetterEFSlipsheetTrayTray5EFMediaInterlvFalseEFInterlvTrayTray5EFMedQualCoatd1EFMedQualCoatd1DEFEFMedQualCust1EFMediaQualityCustom1DEFEFMedQualCust2EFMedQualCust2DEFEFMedQualCust3EFMedQualCust3DEFEFMedQualCust4EFMedQualCust4DEFEFMedQualCust5EFMedQualCust5DEFEFMedQualHeavy1EFMedQualHeavy1DEFEFMedQualHeavy2EFMedQualHeavy2DEFEFMedQualPlainEFMedQualPlainDEFEFMedQualRcycldEFMedQualRcycldDEFEFPrintSizeEFPrintSizeDEFEFCreateMasterNoneEFUseMasterNoneEFPPTSlideFalseEFPrintMasterEFPrintMasterDEFPageSizeLetterPageRegionLeadingEdge€IIFE2IFE¡" dýÿXà?à?U}  X@X@X@X@X@X@X@½€^ã@€^ã@ €^ã@!€^ã@ý "½_ã@_ã@_ã@_ã@ý "½Àmã@Àmã@Àmã@Àmã@ý "½ _ã@ _ã@ _ã@ _ã@ý "ý ##ý $ý $ý $½ _ã@% _ã@& _ã@תx0000*>¶@å ï7 þÿà…ŸòùOh«‘+'³Ù0¬@H`t Œ ˜¤äH.Merijn Brand H.M. BrandaMicrosoft Excel@€S}½© É@€ávÁÙ ÉþÿÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ­ä PROCURA B.V.eTe2  DateTest  Worksheets þÿÿÿþÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF ßéTï ÉþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSSummaryInformation(ÿÿÿÿ DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.63/files/test_t.csv0000644000031300001440000000005010614363313020373 0ustar00merijnusers00000000000000A1 B1 D1 A2 B2 A3 'C3' D3 A4 B4 C4 Spreadsheet-Read-0.63/files/attr.xls0000644000031300001440000005700010452463445020074 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ -þÿÿÿþÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ú0ÍÉ@á°Áâ\ppc09 B°aÀ=œ¯¼=xKÌB}(8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1È Arial1ÈArial1È Arial1È Arial1È Arial1È Arial1È(Arial1ÈArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1Èÿ¼Arial10Èÿ¼Arial Unicode MS1*Èÿ¼ Letter Gothic1,Èÿ¼LettrGoth12 BT1,Èÿ¼Lucida Console16Èÿ¼Lucida Sans Unicode1ÈÿArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1Èÿ¼Arial10Èÿ¼Arial Unicode MS1*Èÿ¼ Letter Gothic1,Èÿ¼LettrGoth12 BT1,Èÿ¼Lucida Console16Èÿ¼Lucida Sans Unicode1ÈÿArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1xÿArial10xÿArial Unicode MS1*xÿ Letter Gothic1,xÿLettrGoth12 BT1,xÿLucida Console16xÿLucida Sans Unicode1hÿArial10hÿArial Unicode MS1*hÿ Letter Gothic1,hÿLettrGoth12 BT1,hÿLucida Console16hÿLucida Sans Unicode7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-#¤"¬ "\ #,##0.00_-¥d/m ¦h:mm§ 00.00.00.000¨**\ #,###,#00,000.00,**àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à,õÿ øÀ à*õÿ øÀ à À à À à À à À à  À à  À à  À à  À à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @( à H( à H( à H( à H( à  H( à  H( à  H( à  H( à @ à H à H à H à H à  H à  H à  H à  H à!À à"À à#À àÀ àÀ àÀ àÀ àÀ àÀ àÀ àÀ à0À à1À à2À à3À à$À àÀ àÀ à4À à  À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à  À à! À à" À à# À à$ À à% À à& À à' À à( À à) À à* À à+ À à, À à- À à. À à/ À à0 À à1 À à2 À à3 À à4 À à5 À à À ठÀ à, À ॠÀ ঠÀ à  À à  À à  À à1 À à§ À ਠÀ à €À à €À à À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`…xColours…e)Format…z, Alignment… i/FontsŒÁÁ`iüLžredgreenbluewhiteyellow lightgreen lightblueautograyleftmiddlerighttopbottomjustifyfillArialArial Unicode MS Letter GothicLettrGoth12 BTLucida ConsoleLucida Sans Unicodebolditalic bold italic underline6 point18 pointmergedunlockedhiddenÿ"  PR‘ ú0ÍÉ@  Ú#)  dü©ñÒMbP?_*+‚€%ÿÁƒ„M¢xeroxÜÄSÿ š 4dXXA4PRIVâ0''''ÄP4(ˆ/¾hž ÿ¡" dXXà?à?U  ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿý ý ý &ý /ý 8ý Aý Jý Sý \ý ý ý 'ý 0ý 9ý Bý Ký Tý ]ý ý ý (ý 1ý :ý Cý Lý Uý ^ý ý  ý )ý 2ý ;ý Dý Mý Vý _ý ý !ý *ý 3ý <ý Eý Ný Wý `ý ý "ý +ý 4ý =ý Fý Oý Xý aý ý #ý ,ý 5ý >ý Gý Pý Yý bý ý $ý -ý 6ý ?ý Hý Qý Zý cý ý %ý .ý 7ý @ý Iý Rý [ý d×" ~~~~~~~~>¶@ï7 ú0ÍÉ@  !*,  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} Û ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ~ €È@~ ¡€È@ý ®®~ ¢€È@ý ¬~ £€È@ý ­~ ¤€È@~ ¥€È@~ ¦€È@~ §€È@~ ¨€È@~ ©€È@~ ª€È@~ «€È@×ÌÜ&>¶@å ï7 ú0ÍÉ@ 6- /  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} ¶ ’@’@’@’@’@ý ý e ý f ý g ý tý h ý i ý j ý k ý uý l ý m ý n ý o ý vý  ý e ý f ý g ý tý pý q ý r ý s ý w×ÂPFFFF>¶@ï7 ú0ÍÉ@ Ë37  dü©ñÒMbP?_*+‚€%ÿÁƒ„M¢xeroxÜÄSÿ š 4dXXA4PRIVâ0''''ÄP4(ˆ/¾hž ÿ¡" dXXà?à?U} ¶} Û} I} m} ¶} ’ } m$ÑÑÑàÂÂý ý }ý ƒý ‰ý ý •ý ›ý ý }ý ƒý ‰ý ý •ý ›ý xý ~ý „ý Šý ý –ý œý yý ý …ý ‹ý ‘ý —ý ý zý €ý †ý Œý ’ý ˜ý žý {ý ý ‡ý ý “ý ™ý Ÿý |ý ‚ý ˆý Žý ”ý šý  ×:xbbbbbb>¶@  ï7 þÿà…ŸòùOh«‘+'³Ù0 @HXh € Œ˜äpc09fpc09fMicrosoft Excel@(Ä$FŸÆ@*A@jŸÆþÿÕÍÕœ.“—+,ù®0ô PXp x€ˆ ˜ Ïä PROCURA B.V.lig ColoursFormat AlignmentFonts  Werkbladen þÿÿÿ !"#þÿÿÿ%&'()*+þÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿÚ7SummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ$Spreadsheet-Read-0.63/files/values.xls0000644000031300001440000003300010313232324020375 0ustar00merijnusers00000000000000ÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ì0ÍÁ@á°Áâ\ppc16 B°aÀ=œ¯¼=hKL;‚#8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à,õÿ øÀ à*õÿ øÀ à À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ÇBlad1ŒÁÁ`iü@ A1 labelspaceemptynulonequoteÿu ¥< ì0ÍÁ@ ƒW  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿÿý ý ½ð?ý ý ý ý ý ý ý ×¼@>¶@ï7 þÿà…ŸòùOh«‘+'³Ù0 @HXh € Œ˜äpc16fpc16fMicrosoft Excel@™2 L¹Å@N9L¹ÅþÿÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ªä PROCURA B.V.We Blad1  Werkbladenþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.63/README0000644000031300001440000000320212464166307016145 0ustar00merijnusers00000000000000=head1 NAME Spreadsheet::Read - Meta-Wrapper for reading spreadsheet data =head1 SYNOPSIS use Spreadsheet::Read; my $ref = ReadData ("file.xls"); =head1 DESCRIPTION Spreadsheet::Read offers a uniformed wrapper to Spreadsheet::ParseExcel and Spreadheet::ReadSXC to give the end-user a single point of view to various types of spreadsheets and deal with these in a transparent way. For more thorough documentation please refer to the perl documentation in the module in pod format, or $ man Spreadsheet::Read after installation. =head1 INSTALLATION $ perl Makefile.PL $ make $ make test $ make install If the C warns you in the xls tests, read the message and apply the generated patch. Spreadsheet::ParseExcel has a small bug in the parsing of the default format regarding UTF-8. This module requires perl-5.6.x or newer. Recent changes can be (re)viewed in the public GIT repository at https://github.com/Tux/Spreadsheet-Read Feel free to clone your own copy: $ git clone https://github.com/Tux/Spreadsheet-Read Spreadsheet-Read or get it as a tgz: $ wget --output-document=Spreadsheet-Read-git.tgz \ 'https://github.com/Tux/Spreadsheet-Read/archive/master.tar.gz' =head1 TODO * Make tests for examples/xlscat * Support Parsers native module options * Check if Tk is installed before asking if ss2tk is wanted * Test diagnostics output * Make clip skip empty sheets =head1 AUTHOR H.Merijn Brand, =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2015 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.63/META.json0000644000031300001440000000670212606163731016712 0ustar00merijnusers00000000000000{ "author" : [ "H.Merijn Brand " ], "meta-spec" : { "version" : "2", "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec" }, "version" : "0.63", "optional_features" : { "opt_oo" : { "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ReadSXC" : "0.20" } } }, "description" : "Provides parsing of OpenOffice spreadsheets" }, "opt_tools" : { "prereqs" : { "runtime" : { "recommends" : { "Tk::TableMatrix::Spreadsheet" : "0", "Tk" : "804.033", "Tk::NoteBook" : "0" } } }, "description" : "Spreadsheet tools" }, "opt_csv" : { "description" : "Provides parsing of CSV streams", "prereqs" : { "runtime" : { "requires" : { "Text::CSV_XS" : "0.71" }, "recommends" : { "Text::CSV_PP" : "1.33", "Text::CSV" : "1.33", "Text::CSV_XS" : "1.20" } } } }, "opt_excel" : { "description" : "Provides parsing of Microsoft Excel files", "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ParseExcel" : "0.34", "Spreadsheet::ParseExcel::FmtDefault" : "0" }, "recommends" : { "Spreadsheet::ParseExcel" : "0.65" } } } }, "opt_excelx" : { "description" : "Provides parsing of Microsoft Excel 2007 files", "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ParseExcel::FmtDefault" : "0", "Spreadsheet::ParseXLSX" : "0.13" }, "recommends" : { "Spreadsheet::ParseXLSX" : "0.18" } } } } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ], "repository" : { "type" : "git", "url" : "https://github.com/Tux/Spreadsheet-Read", "web" : "https://github.com/Tux/Spreadsheet-Read" } }, "license" : [ "perl_5" ], "provides" : { "Spreadsheet::Read" : { "file" : "Read.pm", "version" : "0.63" } }, "generated_by" : "Author", "abstract" : "Meta-Wrapper for reading spreadsheet data", "name" : "Spreadsheet-Read", "dynamic_config" : 1, "prereqs" : { "runtime" : { "recommends" : { "Data::Peek" : "0.44", "File::Temp" : "0.2304", "IO::Scalar" : "0" }, "requires" : { "Data::Dumper" : "0", "Exporter" : "0", "Carp" : "0", "perl" : "5.006", "File::Temp" : "0.22", "Data::Peek" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "test" : { "recommends" : { "Test::More" : "1.001014" }, "requires" : { "Test::More" : "0.88", "Test::NoWarnings" : "0", "Test::Harness" : "0" } } } } Spreadsheet-Read-0.63/t/0000755000031300001440000000000012606163731015527 5ustar00merijnusers00000000000000Spreadsheet-Read-0.63/t/203_csv.t0000644000031300001440000000565611716411060017077 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/610_xlsx.t0000644000031300001440000000760112543027353017303 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 78; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.xlsx", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/50_sc.t0000644000031300001440000000304211163713072016620 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 48; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirelCalc parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $txt ("files/test.sc", $content) { foreach my $clip (0, 2) { my $sc; ok ($sc = ReadData ($txt, clip => $clip), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/221_csv.t0000644000031300001440000000202712543027277017100 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/622_fmt.t0000644000031300001440000000436112543027365017101 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/210_csv.t0000644000031300001440000000766412543027242017102 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 133; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.csv", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/611_clr.t0000644000031300001440000000305212564060227017062 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/46_clr.t0000644000031300001440000000273511163651103017004 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 256; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "No OpenOffice ODS parser found"; $parser->VERSION <= 0.20 and plan skip_all => "Spreadsheet::ReadSXC version " . $parser->VERSION . " doesn't support field attributes"; my $ods; ok ($ods = ReadData ("files/attr.ods", attr => 1), "Excel Attributes testcase"); my $clr = $ods->[$ods->[0]{sheet}{Colours}]; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/627_merged.t0000644000031300001440000000200112543027371017545 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 11; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); done_testing; Spreadsheet-Read-0.63/t/604_dates.t0000644000031300001440000000476512543027450017416 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/635_perc.t0000644000031300001440000000247412601170271017241 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls = eval { ReadData ("files/perc.xlsx", attr => 1) }; my $pv = $ENV{SPREADSHEET_READ_XLSX}->VERSION; $pv le "v0.38.6" && !defined $xls and plan skip_all => "$ENV{SPREADSHEET_READ_XLSX} cannot read perc.xlsx"; ok ($xls, "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/212_csv.t0000644000031300001440000000244612543027252017076 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.63/t/621_clr.t0000644000031300001440000000304512564056336017073 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/202_csv.t0000644000031300001440000000233411163712203017063 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.63/t/36_xls.t0000644000031300001440000001205311716411071017025 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { plan tests => 172; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "xls", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], # [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadDataStream ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadDataStream ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadDataStream ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.63/t/605_perc.t0000644000031300001440000000206412543027453017241 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/631_clr.t0000644000031300001440000000306412564074160017070 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/35_perc.t0000644000031300001440000000151311163712567017160 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xls", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); my $i = int $ss->{"A$row"}; is ($ss->{"B$row"}, "$i%", "Formatted values for row $row\n"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/607_merged.t0000644000031300001440000000166512543027456017566 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 11; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); done_testing; Spreadsheet-Read-0.63/t/632_fmt.t0000644000031300001440000000443112576466452017112 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); SKIP: { my $hidden = $fmt->{attr}[2][4]{hidden}; $hidden or skip "$parser $xls->[0]{version} does not yet support 'hidden' attributes", 1; is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); } is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { SKIP: { $fmt->{"A$r"} eq "12345" and skip "$parser $xls->[0]{version} does not yet support format # ?/?", 1; isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/00_pod.t0000644000031300001440000000022410313230744016763 0ustar00merijnusers00000000000000#!/usr/bin/perl use Test::More; eval "use Test::Pod 1.00"; plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; all_pod_files_ok (); Spreadsheet-Read-0.63/t/620_xlsx.t0000644000031300001440000000757412543027363017316 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 78; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.xlsx", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/222_csv.t0000644000031300001440000000244612543027300017071 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.63/t/01_pod.t0000644000031300001440000000034410313243044016764 0ustar00merijnusers00000000000000#!/usr/bin/perl use Test::More; eval "use Test::Pod::Coverage tests => 1"; plan skip_all => "Test::Pod::Covarage required for testing POD Coverage" if $@; pod_coverage_ok ("Spreadsheet::Read", "Spreadsheet::Read is covered"); Spreadsheet-Read-0.63/t/623_misc.t0000644000031300001440000000232112543027366017242 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is (0+@{ $xls->[1]{cell}[1]}, 0, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/603_misc.t0000644000031300001440000000220512543027444017236 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is (0+@{ $xls->[1]{cell}[1]}, 0, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/625_perc.t0000644000031300001440000000220012543027370017231 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/637_merged.t0000644000031300001440000000206012566640270017557 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 11; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $pv = $parser->VERSION; $pv le "v0.38.12" and plan skip_all => "No reliable merged cell support in version $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); done_testing; Spreadsheet-Read-0.63/t/34_dates.t0000644000031300001440000000447612266462015017334 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xls", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", undef ], A2 => [ "12-Aug", undef ], A3 => [ "8-Dec", undef ], A4 => [ "13-Aug", undef ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, undef, "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/37_merged.t0000644000031300001440000000152512474072373017477 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 11; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; ok (my $ss = ReadData ("files/merged.xls", attr => 1)->[1], "Read merged xls"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); done_testing; Spreadsheet-Read-0.63/t/223_csv.t0000644000031300001440000000577012543027302017077 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/204_csv.t0000644000031300001440000000571011311672757017104 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/200_csv.t0000644000031300001440000000755212536773577017122 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 133; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.csv", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/634_dates.t0000644000031300001440000000512112543027377017414 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/201_csv.t0000644000031300001440000000171512524343302017066 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/612_fmt.t0000644000031300001440000000436612543027355017104 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/630_xlsx.t0000644000031300001440000001025312601167477017311 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); # cmp_ok ($xls->[0]{version}, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies { my $xls = eval { ReadData ("files/values.xlsx") }; unless ($xls) { diag "$parser cannot read values.xlsx"; # Fake results till it is fixed $xls = [{},{cell=>[[],[0,"A1"],[0," "],[0,undef],[0,0],[0,1],[0,""]], A1=>"A1",B1=>" ",C1=>undef,D1=>0,E1=>1,F1=>""}]; } ok ($xls, "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); } { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.xlsx", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/11_call.t0000644000031300001440000000157311163710701017126 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; use Test::More; use Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirelCalc parser found"; plan tests => 81; # Base attributes foreach my $onoff (0, 1) { for ( [ ], [ rc => $onoff ], [ cell => $onoff ], [ rc => 0, cell => $onoff ], [ rc => 1, cell => $onoff ], [ clip => $onoff ], [ cell => 0, clip => $onoff ], [ cell => 1, clip => $onoff ], [ attr => $onoff ], [ cell => 0, attr => $onoff ], ) { my $ref = ReadData ("files/test.sc", @$_); ok ($ref, "Open with options (@$_)"); ok (ref $ref, "Valid ref"); $ref = ReadData ("files/test.sc", { @$_ }); ok ($ref, "Open with options {@$_}"); ok (ref $ref, "Valid ref"); } } # TODO: test and catch unsupported option. # Currently they are silently ignored Spreadsheet-Read-0.63/t/211_csv.t0000644000031300001440000000202712543027246017073 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/214_csv.t0000644000031300001440000000602212543027261017072 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/624_dates.t0000644000031300001440000000510112543027367017410 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/220_csv.t0000644000031300001440000000766412543027265017110 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 133; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.csv", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/601_clr.t0000644000031300001440000000273112564056346017073 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/600_xlsx.t0000644000031300001440000000746512575574173017326 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 78; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); like ($xls->[0]{version}, qr{[0-9]}, "Has version with digit"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.xlsx", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/40_sxc.t0000644000031300001440000000673511166722704017030 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sxc") or plan skip_all => "No SXC parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.sxc"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.sxc") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } foreach my $base ( [ "files/test.sxc", "Read/Parse sxc file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ) { my ($txt, $msg) = @$base; my $sxc; ok ($sxc = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/32_fmt.t0000644000031300001440000000340311163712315017001 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 39; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $fmt = $xls->[$xls->[0]{sheet}{Format}]; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, "", "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], "", "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/615_perc.t0000644000031300001440000000220512543027360017234 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/31_clr.t0000644000031300001440000000247411163712261017001 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 256; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $clr = $xls->[$xls->[0]{sheet}{Colours}]; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/213_csv.t0000644000031300001440000000577012543027257017107 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/10_basics.t0000644000031300001440000000736112143367136017470 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; use Test::More tests => 99; use Test::NoWarnings; use Spreadsheet::Read qw(:DEFAULT parses rows ); is (Spreadsheet::Read::Version (), $Spreadsheet::Read::VERSION, "Version check"); is (parses (undef), 0, "No sheet type"); is (parses ("xyzzy"), 0, "Unknown sheet type"); is (parses ("xls"), parses ("excel"), "Excel alias type"); is (parses ("sxc"), parses ("oo"), "OpenOffice alias type 1"); is (parses ("sxc"), parses ("OpenOffice"), "OpenOffice alias type 2"); is (parses ("prl"), parses ("perl"), "Perl alias type"); foreach my $x ([ "A1", 1, 1 ], [ "Z26", 26, 26 ], [ "AB12", 28, 12 ], [ "A", 0, 0 ], [ "19", 0, 0 ], [ "a9", 1, 9 ], [ "aAa9", 703, 9 ], [ "", 0, 0 ], [ undef, 0, 0 ], [ "x444444", 24, 444444 ], [ "xxxxxx4", 296559144, 4 ], ) { my $cell = $x->[0]; my ($c, $r) = cell2cr ($x->[0]); defined $cell or $cell = ""; is ($c, $x->[1], "Col for $cell"); is ($r, $x->[2], "Row for $cell"); } foreach my $x ([ 1, 1, "A1" ], [ 26, 26, "Z26" ], [ 28, 12, "AB12" ], [ 0, 0, "" ], [ -2, 0, "" ], [ 0, -12, "" ], [ 1, -12, "" ], [ undef, 1, "" ], [ 2, undef, "" ], [ 1, 9, "A9" ], [ 703, 9, "AAA9" ], [ 24, 444444, "X444444" ], [ 296559144, 4, "XXXXXX4" ], ) { my $cell = cr2cell ($x->[0], $x->[1]); my ($c, $r) = map { defined $_ ? $_ : "--undef --" } $x->[0], $x->[1]; is ($cell, $x->[2], "Cell for ($c, $r)"); } # Some illegal rows () calls for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ($_); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ cell => $arg})"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxrow => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxrow => 1, cell => $arg })"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxcol => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxcol => 1, cell => $arg })"); } # Some illegal ReadData () calls for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ($_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ([ $_ ]); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ([ $arg ])"); } SKIP: { -c "/dev/null" or skip "/dev/null cannot be used for tests", 7; for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ("/dev/null", separator => $_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } } for (undef, "", " ", 0, 1, [], {}) { my $ref; eval { $ref = ReadData ("Read.pm", sep => $_); }; my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } Spreadsheet-Read-0.63/t/30_xls.t0000644000031300001440000001376312537000062017024 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; plan tests => 234; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } { my $ref; $ref = ReadData ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadData ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadData ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xls", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } { # RT#105197 - Strip wrong selection my $ref = ReadData ("files/blank.xls", strip => 1); ok ($ref, "strip cells 1 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xls", strip => 1, cells => 0); ok ($ref, "strip cells 0 rc 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", strip => 1, rc => 0); ok ($ref, "strip cells 1 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xls", strip => 1, cells => 0, rc => 0); ok ($ref, "strip cells 0 rc 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.63/t/613_misc.t0000644000031300001440000000232612543027356017245 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is (0+@{ $xls->[1]{cell}[1]}, 0, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/224_csv.t0000644000031300001440000000602212543027303017070 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/617_merged.t0000644000031300001440000000200612543027361017550 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 11; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); done_testing; Spreadsheet-Read-0.63/t/614_dates.t0000644000031300001440000000510612543027701017404 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/51_sc.t0000644000031300001440000000321111275744765016640 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 26; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirelCalc parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "sc", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $clip (0, 2) { my $sc; ok ($sc = ReadDataStream ("files/test.sc", clip => $clip), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/33_misc.t0000644000031300001440000000275411761614142017162 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 6; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is (0+@{ $xls->[1]{cell}[1]}, 0, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc_ws.xls", # No cells generated, but we strip whitespace. We don't want any warning cells => 0, strip => 3, debug => 5, ); } ok ($xls, "Open with options, let's see if we get any warnings"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/633_misc.t0000644000031300001440000000257312545751560017256 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX::Reader::LibXML"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = eval { ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, )}; } $ENV{SPREADSHEET_READ_XLSX}->VERSION le "v0.38.6" && !defined $xls and plan skip_all => "$ENV{SPREADSHEET_READ_XLSX} cannot read misc.xlsx"; ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is (0+@{ $xls->[1]{cell}[1]}, 0, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/45_ods.t0000644000031300001440000000662411163712761017021 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "No SXC parser found"; my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.ods"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.ods") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } foreach my $base ( [ "files/test.ods", "Read/Parse ods file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ) { my ($txt, $msg) = @$base; my $sxc; ok ($sxc = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.63/t/602_fmt.t0000644000031300001440000000424612545741253017102 0ustar00merijnusers00000000000000#!/usr/bin/perl use strict; use warnings; my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX$/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests);