Spreadsheet-XLSX-0.13/ 777 0 0 0 11373730730 7457 5Spreadsheet-XLSX-0.13/Changes 777 0 0 4137 11373733103 11037 0Revision history for Perl extension Spreadsheet::XLSX. 0.13 Sun May 16 13:08:12 MSD 2010 - ability to read xlsx from filehandle (RT #57483, thanks Sergey Pushkin) 0.12 Tue Oct 6 10:04:37 MSD 2009 - sheets are now detected by relations (xl/_rels/workbook.xml.rels), not numbers (RT #50236, thanks Pat Mariani) 0.11 Mon Oct 5 19:03:46 MSD 2009 - sheets numbering fixed (RT #50211, thanks endacoe) 0.1 Wed Mar 25 18:19:46 MSK 2009 - bypassing empty sheets (thanks Lukasz Wilun for an example with diagrams); - rich text within a cell (by Rob Polocz); 0.09 Mon Jan 26 09:57:04 MSK 2009 - fixed using of $1 after unsuccessful m// (thanks HMBRAND); 0.08 Mon Jan 5 18:07:57 MSK 2009 - Perl version requirement lowered (thanks HMBRAND) 0.07 Thu Dec 18 09:46:18 MSK 2008 - "Use of uninitialized value ..." warnings suppressed (thanks Gregor Herrmann) 0.04 Fri Nov 14 09:25:47 MSK 2008 - RE fixed for the case of opening with attributes (thanks Loreyna Yeung) 0.06 Tue Dec 16 18:06:17 MSK 2008 - files missed from MANIFEST and, therefore, from .tar.gz :-( Sorry, everybody! 0.05 Fri Dec 12 17:28:23 MSK 2008 - a lot of fixes by Rob Polocz (dependency on Spreadsheet::ParseExcel introduced): -- Added support for styles and formatted strings; -- create and use ParseExcel Workbook, Spreadsheet, and Cell objects; -- 1904 date convention support; -- empty tag support; -- received permission from the Spreadsheet::ParseExcel guys to leverage the formatting classes and check them in to this project. 0.03 Tue May 20 05:18:41 UTC 2008 - fixed the incorrect mapping for columns > AA (thanks JMELTZER http://rt.cpan.org/Public/Bug/Display.html?id=36013) - added support for r:id attribute (Ibid) 0.02 Mon May 12 07:02:31 UTC 2008 - fixed a bug with 1st dictionnary string (thanks SSIMMS: http://rt.cpan.org/Public/Bug/Display.html?id=35489) - prereq relaxed (thanx SSIMMS: http://rt.cpan.org/Public/Bug/Display.html?id=35490) 0.01 Thu Mar 13 09:41:52 2008 - original version; created by h2xs 1.23 with options -A -X -n Spreadsheet::XLSC --skip-exporter --skip-autoloader Spreadsheet-XLSX-0.13/lib/ 777 0 0 0 11373730735 10232 5Spreadsheet-XLSX-0.13/lib/Spreadsheet/ 777 0 0 0 11373730742 12477 5Spreadsheet-XLSX-0.13/lib/Spreadsheet/XLSX/ 777 0 0 0 11373730747 13302 5Spreadsheet-XLSX-0.13/lib/Spreadsheet/XLSX.pm 777 0 0 20333 11373732725 13742 0package Spreadsheet::XLSX; use 5.006000; use strict; use warnings; our @ISA = qw(); our $VERSION = '0.13'; use Archive::Zip; use Spreadsheet::XLSX::Fmt2007; use Data::Dumper; use Spreadsheet::ParseExcel; ################################################################################ sub new { my ($class, $filename, $converter) = @_; my $self = {}; $self -> {zip} = Archive::Zip -> new (); if (ref $filename) { $self -> {zip} -> readFromFileHandle ($filename) == Archive::Zip::AZ_OK or die ("Cannot open data as Zip archive"); } else { $self -> {zip} -> read ($filename) == Archive::Zip::AZ_OK or die ("Cannot open $filename as Zip archive"); }; my $member_shared_strings = $self -> {zip} -> memberNamed ('xl/sharedStrings.xml'); my @shared_strings = (); if ($member_shared_strings) { my $mstr = $member_shared_strings->contents; $mstr =~ s//<\/t>/gsm; # this handles an empty t tag in the xml foreach my $si ($mstr =~ /(.*?)<\/si/gsm) { my $str; foreach my $t ($si =~ /(.*?)<\/t/gsm) { $t = $converter -> convert ($t) if $converter; $str .= $t; } push @shared_strings, $str; } } my $member_styles = $self -> {zip} -> memberNamed ('xl/styles.xml'); my @styles = (); my %style_info = (); if ($member_styles) { foreach my $t ($member_styles -> contents =~ /xf\ numFmtId="([^"]*)"(?!.*\/cellStyleXfs)/gsm) { #" # $t = $converter -> convert ($t) if $converter; push @styles, $t; } my $default = $1 || ''; foreach my $t1 (@styles){ $member_styles -> contents =~ /numFmtId="$t1" formatCode="([^"]*)/; my $formatCode = $1 || ''; if ($formatCode eq $default || not($formatCode)){ if ($t1 == 9 || $t1==10){ $formatCode="0.00000%";} elsif ($t1 == 14){ $formatCode="m-d-yy";} else { $formatCode=""; } } $style_info{$t1} = $formatCode; $default = $1 || ''; } } my $member_rels = $self -> {zip} -> memberNamed ('xl/_rels/workbook.xml.rels') or die ("xl/_rels/workbook.xml.rels not found in this zip\n"); my %rels = (); foreach ($member_rels -> contents =~ /\/g) { /^Id="(.*?)".*?Target="(.*?)"/ or next; $rels {$1} = $2; } my $member_workbook = $self -> {zip} -> memberNamed ('xl/workbook.xml') or die ("xl/workbook.xml not found in this zip\n"); my $oBook = Spreadsheet::ParseExcel::Workbook->new; $oBook->{SheetCount} = 0; $oBook->{FmtClass} = Spreadsheet::XLSX::Fmt2007->new; $oBook->{Flg1904}=0; if ($member_workbook->contents =~ /date1904="1"/){ $oBook->{Flg1904}=1; } my @Worksheet = (); foreach ($member_workbook -> contents =~ /\<(.*?)\/?\>/g) { /^(\w+)\s+/; my ($tag, $other) = ($1, $'); my @pairs = split /\" /, $other; $tag eq 'sheet' or next; my $sheet = { MaxRow => 0, MaxCol => 0, MinRow => 1000000, MinCol => 1000000, }; foreach ($other =~ /(\S+=".*?")/gsm) { my ($k, $v) = split /=?"/; #" if ($k eq 'name') { $sheet -> {Name} = $v; $sheet -> {Name} = $converter -> convert ($sheet -> {Name}) if $converter; } elsif ($k eq 'r:id') { $sheet -> {path} = $rels {$v}; }; } my $wsheet = Spreadsheet::ParseExcel::Worksheet->new(%$sheet); push @Worksheet, $wsheet; $oBook->{Worksheet}[$oBook->{SheetCount}] = $wsheet; $oBook->{SheetCount}+=1; } $self -> {Worksheet} = \@Worksheet; foreach my $sheet (@Worksheet) { my $member_sheet = $self -> {zip} -> memberNamed ("xl/$sheet->{path}") or next; my ($row, $col); my $flag = 0; my $s = 0; my $s2 = 0; my $sty = 0; foreach ($member_sheet -> contents =~ /(\<.*?\/?\>|.*?(?=\<))/g) { if (/^\"){$v="";} my $type = "Text"; my $thisstyle = ""; if (not($s) && not($s2)){ $type="Numeric"; $thisstyle = $style_info{$styles[$sty]}; if ($thisstyle =~ /(? {MaxRow} = $row if $sheet -> {MaxRow} < $row; $sheet -> {MaxCol} = $col if $sheet -> {MaxCol} < $col; $sheet -> {MinRow} = $row if $sheet -> {MinRow} > $row; $sheet -> {MinCol} = $col if $sheet -> {MinCol} > $col; if ($v =~ /(.*)E\-(.*)/gsm && $type eq "Numeric"){ $v=$1/(10**$2); # this handles scientific notation for very small numbers } my $cell =Spreadsheet::ParseExcel::Cell->new( Val => $v, Format => $thisstyle, Type => $type ); $cell->{_Value} = $oBook->{FmtClass}->ValFmt($cell, $oBook); if ($type eq "Date" && $v<1){ #then this is Excel time field $cell->{Type}="Text"; $cell->{Val}=$cell->{_Value}; } $sheet -> {Cells} [$row] [$col] = $cell; } } $sheet -> {MinRow} = 0 if $sheet -> {MinRow} > $sheet -> {MaxRow}; $sheet -> {MinCol} = 0 if $sheet -> {MinCol} > $sheet -> {MaxCol}; } foreach my $stys (keys %style_info){ } bless ($self, $class); return $oBook; } 1; __END__ =head1 NAME Spreadsheet::XLSX - Perl extension for reading MS Excel 2007 files; =head1 SYNOPSIS use Text::Iconv; my $converter = Text::Iconv -> new ("utf-8", "windows-1251"); # Text::Iconv is not really required. # This can be any object with the convert method. Or nothing. use Spreadsheet::XLSX; my $excel = Spreadsheet::XLSX -> new ('test.xlsx', $converter); foreach my $sheet (@{$excel -> {Worksheet}}) { printf("Sheet: %s\n", $sheet->{Name}); $sheet -> {MaxRow} ||= $sheet -> {MinRow}; foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) { $sheet -> {MaxCol} ||= $sheet -> {MinCol}; foreach my $col ($sheet -> {MinCol} .. $sheet -> {MaxCol}) { my $cell = $sheet -> {Cells} [$row] [$col]; if ($cell) { printf("( %s , %s ) => %s\n", $row, $col, $cell -> {Val}); } } } } =head1 DESCRIPTION This module is a (quick and dirty) emulation of Spreadsheet::ParseExcel for Excel 2007 (.xlsx) file format. It supports styles and many of Excel's quirks, but not all. It populates the classes from Spreadsheet::ParseExcel for interoperability; including Workbook, Worksheet, and Cell. =head1 SEE ALSO =over 2 =item Text::CSV_XS, Text::CSV_PP http://search.cpan.org/~hmbrand/ A pure perl version is available on http://search.cpan.org/~makamaka/ =item Spreadsheet::ParseExcel http://search.cpan.org/~kwitknr/ =item Spreadsheet::ReadSXC http://search.cpan.org/~terhechte/ =item Spreadsheet::BasicRead http://search.cpan.org/~gng/ for xlscat likewise functionality (Excel only) =item Spreadsheet::ConvertAA http://search.cpan.org/~nkh/ for an alternative set of cell2cr () / cr2cell () pair =item Spreadsheet::Perl http://search.cpan.org/~nkh/ 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's not high on my todo-list. =item xls2csv http://search.cpan.org/~ken/ offers an alternative for my C, in the xls2csv tool, but this tool focusses on character encoding transparency, and requires some other modules. =item Spreadsheet::Read http://search.cpan.org/~hmbrand/ read the data from a spreadsheet (interface module) =back =head1 AUTHOR Dmitry Ovsyanko, Edo@eludia.ru, http://eludia.ru/wiki/ Patches by: Steve Simms Joerg Meltzer Loreyna Yeung Rob Polocz Gregor Herrmann H.Merijn Brand endacoe Pat Mariani Sergey Pushkin =head1 ACKNOWLEDGEMENTS Thanks to TrackVia Inc. (http://www.trackvia.com) for paying for Rob Polocz working time. =head1 COPYRIGHT AND LICENSE Copyright (C) 2008 by Dmitry Ovsyanko This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. =cut Spreadsheet-XLSX-0.13/lib/Spreadsheet/XLSX/Fmt2007.pm 777 0 0 12557 11373732736 15014 0# This code is adapted for Excel 2007 from: # Spreadsheet::XLSX::FmtDefault # by Kawai, Takanori (Hippo2000) 2001.2.2 # This Program is ALPHA version. #============================================================================== package Spreadsheet::XLSX::Fmt2007; use strict; use warnings; use Spreadsheet::XLSX::Utility2007 qw(ExcelFmt); our $VERSION = '0.13'; # my %hFmtDefault = ( 0x00 => '@', 0x01 => '0', 0x02 => '0.00', 0x03 => '#,##0', 0x04 => '#,##0.00', 0x05 => '($#,##0_);($#,##0)', 0x06 => '($#,##0_);[RED]($#,##0)', 0x07 => '($#,##0.00_);($#,##0.00_)', 0x08 => '($#,##0.00_);[RED]($#,##0.00_)', 0x09 => '0%', 0x0A => '0.00%', 0x0B => '0.00E+00', 0x0C => '# ?/?', 0x0D => '# ??/??', 0x0E => 'm-d-yy', 0x0F => 'd-mmm-yy', 0x10 => 'd-mmm', 0x11 => 'mmm-yy', 0x12 => 'h:mm AM/PM', 0x13 => 'h:mm:ss AM/PM', 0x14 => 'h:mm', 0x15 => 'h:mm:ss', 0x16 => 'm-d-yy h:mm', #0x17-0x24 -- Differs in Natinal 0x25 => '(#,##0_);(#,##0)', 0x26 => '(#,##0_);[RED](#,##0)', 0x27 => '(#,##0.00);(#,##0.00)', 0x28 => '(#,##0.00);[RED](#,##0.00)', 0x29 => '_(*#,##0_);_(*(#,##0);_(*"-"_);_(@_)', 0x2A => '_($*#,##0_);_($*(#,##0);_(*"-"_);_(@_)', 0x2B => '_(*#,##0.00_);_(*(#,##0.00);_(*"-"??_);_(@_)', 0x2C => '_($*#,##0.00_);_($*(#,##0.00);_(*"-"??_);_(@_)', 0x2D => 'mm:ss', 0x2E => '[h]:mm:ss', 0x2F => 'mm:ss.0', 0x30 => '##0.0E+0', 0x31 => '@', ); #------------------------------------------------------------------------------ # new (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub new { my($sPkg, %hKey) = @_; my $oThis={ }; bless $oThis; return $oThis; } #------------------------------------------------------------------------------ # TextFmt (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub TextFmt { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub FmtStringDef { my($oThis, $iFmtIdx, $oBook, $rhFmt) =@_; my $sFmtStr = $oBook->{FormatStr}->{$iFmtIdx}; if(!(defined($sFmtStr)) && defined($rhFmt)) { $sFmtStr = $rhFmt->{$iFmtIdx}; } $sFmtStr = $hFmtDefault{$iFmtIdx} unless($sFmtStr); return $sFmtStr; } #------------------------------------------------------------------------------ # FmtString (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub FmtString { my($oThis, $oCell, $oBook) =@_; my $sFmtStr;# = $oThis->FmtStringDef( # $oBook->{Format}[$oCell->{FormatNo}]->{FmtIdx}, $oBook); unless(defined($sFmtStr)) { if ($oCell->{Type} eq 'Numeric') { if($oCell->{Format}){ $sFmtStr=$oCell->{Format}; } elsif(int($oCell->{Val}) != $oCell->{Val}) { $sFmtStr = '0.00'; } else { $sFmtStr = '0'; } } elsif($oCell->{Type} eq 'Date') { if($oCell->{Format}){ $sFmtStr=$oCell->{Format}; } elsif(int($oCell->{Val}) <= 0) { $sFmtStr = 'h:mm:ss'; } else { $sFmtStr = 'm-d-yy'; } } else { $sFmtStr = '@'; } } return $sFmtStr; } #------------------------------------------------------------------------------ # ValFmt (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub ValFmt { my($oThis, $oCell, $oBook) =@_; my($Dt, $iFmtIdx, $iNumeric, $Flg1904); if ($oCell->{Type} eq 'Text') { $Dt = ((defined $oCell->{Val}) && ($oCell->{Val} ne ''))? $oThis->TextFmt($oCell->{Val}, $oCell->{Code}):''; } else { $Dt = $oCell->{Val}; } $Flg1904 = $oBook->{Flg1904}; my $sFmtStr = $oThis->FmtString($oCell, $oBook); return ExcelFmt($sFmtStr, $Dt, $Flg1904, $oCell->{Type}); } #------------------------------------------------------------------------------ # ChkType (for Spreadsheet::XLSX::FmtDefault) #------------------------------------------------------------------------------ sub ChkType { my($oPkg, $iNumeric, $iFmtIdx) =@_; if ($iNumeric) { if((($iFmtIdx >= 0x0E) && ($iFmtIdx <= 0x16)) || (($iFmtIdx >= 0x2D) && ($iFmtIdx <= 0x2F))) { return "Date"; } else { return "Numeric"; } } else { return "Text"; } } 1; __END__ =head1 SYNOPSIS $cell = $myworkbook->worksheet->{Cells}[$row][$col] my $type = $cell->{Type}; # Date, Text, or Numeric my $disp_value = $cell->Value; # displayed (formatted) value set in XLSX by $myFmt2007->ValFmt($cell, $workbook) my $fund_value = $cell->{Val}; # fundemental (underlying) value my $formatter; if ($myworkbook->excel07) { $formatter=Spreadsheet::XLSX::Fmt2007->new(); } else { $formatter=Spreadsheet::ParseExcel::FmtDefault->new(); } my $format_string = $formatter->FmtString($cell,$self->workbook); =cut Spreadsheet-XLSX-0.13/lib/Spreadsheet/XLSX/Utility2007.pm 777 0 0 110266 11373732746 15746 0# This code is adapted for Excel 2007 from: # Spreadsheet::XLSX::Utility # by Kawai, Takanori (Hippo2000) 2001.2.2 # This Program is ALPHA version. #============================================================================== # Spreadsheet::XLSX::Utility; #============================================================================== package Spreadsheet::XLSX::Utility2007; use strict; use warnings; require Exporter; use vars qw(@ISA @EXPORT_OK); @ISA = qw(Exporter); @EXPORT_OK = qw(ExcelFmt LocaltimeExcel ExcelLocaltime col2int int2col sheetRef xls2csv); our $VERSION = '0.13'; my $sNUMEXP = '(^[+-]?\d+(\.\d+)?$)|(^[+-]?\d+\.?(\d*)[eE][+-](\d+))$'; #------------------------------------------------------------------------------ # ExcelFmt (for Spreadsheet::XLSX::Utility2007) #------------------------------------------------------------------------------ sub ExcelFmt { my($sFmt, $iData, $i1904, $sType) =@_; my $sCond; my $sWkF =''; my $sRes=''; $sFmt=unescape_HTML($sFmt); #1. Get Condition if($sFmt=~/^\[([<>=][^\]]+)\](.*)$/) { $sCond = $1; $sFmt = $2; } $sFmt =~ s/_/ /g; my @sFmtWk; my $sFmtObj; my $iFmtPos=0; my $iDblQ=0; my $iQ = 0; foreach my $sWk (split //, $sFmt) { if($iDblQ or $iQ) { $sFmtWk[$iFmtPos] .=$sWk; $iDblQ = 0 if($sWk eq '"'); $iQ = 0; next; } if($sWk eq ';') { $iFmtPos++; next; } elsif($sWk eq '"') { $iDblQ = 1; } elsif($sWk eq '!') { $iQ = 1; } elsif($sWk eq '\\') { $iQ = 1; # next; } elsif($sWk eq '(') { #Skip? next; } elsif($sWk eq ')') { #Skip? next; } $sFmtWk[$iFmtPos] .=$sWk; } #Get FmtString if(scalar(@sFmtWk)>1) { if($sCond) { $sFmtObj = $sFmtWk[((eval(qq/"$iData" $sCond/))? 0: 1)]; } else { my $iWk = ($iData =~/$sNUMEXP/)? $iData: 0; # $iData = abs($iData) if($iWk !=0); if(scalar(@sFmtWk)==2) { $sFmtObj = $sFmtWk[(($iWk>=0)? 0: 1)]; } elsif(scalar(@sFmtWk)==3) { $sFmtObj = $sFmtWk[(($iWk>0)? 0: (($iWk<0)? 1: 2))]; } else { if($iData =~/$sNUMEXP/) { $sFmtObj = $sFmtWk[(($iWk>0)? 0: (($iWk<0)? 1: 2))]; } else { $sFmtObj = $sFmtWk[ 3]; } } } } else { $sFmtObj = $sFmtWk[0]; } my $sColor; if($sFmtObj =~ /^(\[[^hm\[\]]*\])/) { $sColor = $1; $sFmtObj = substr($sFmtObj, length($sColor)); chop($sColor); $sColor = substr($sColor, 1); } #print "FMT:$sFmtObj Co:$sColor\n"; #3.Build Data my $iFmtMode=0; #1:Number, 2:Date my $i=0; my $ir=0; my $sFmtWk; my @aRep = (); my $sFmtRes=''; my $iFflg = -1; my $iRpos = -1; my $iCmmCnt = 0; my $iBunFlg = 0; my $iFugouFlg = 0; my $iPer = 0; my $iAm=0; my $iSt; while($i=0) && (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { push @aRep, ['mm', length($sFmtRes), 2, 'min']; } else { push @aRep, [substr($sFmtObj, $i, 2), length($sFmtRes), 2]; } if((substr($sFmtObj, $i, 2) eq 'ss') && ($#aRep>0)) { if(($aRep[$#aRep-1]->[0] eq 'm') || ($aRep[$#aRep-1]->[0] eq 'mm')) { push(@{$aRep[$#aRep-1]}, 'min'); } } $i+=2; } elsif((substr($sFmtObj, $i, 1) eq 'm') || (substr($sFmtObj, $i, 1) eq 'd') || (substr($sFmtObj, $i, 1) eq 'h') || (substr($sFmtObj, $i, 1) eq 's')){ if((substr($sFmtObj, $i, 1) eq 'm') && ($#aRep>=0) && (($aRep[$#aRep]->[0] eq 'h') or ($aRep[$#aRep]->[0] eq 'hh'))) { push @aRep, ['m', length($sFmtRes), 1, 'min']; } else { push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; } if((substr($sFmtObj, $i, 1) eq 's') && ($#aRep>0)) { if(($aRep[$#aRep-1]->[0] eq 'm') || ($aRep[$#aRep-1]->[0] eq 'mm')) { push(@{$aRep[$#aRep-1]}, 'min'); } } $i+=1; } } elsif((substr($sFmtObj, $i, 3) eq '[h]')) { push @aRep, ['[h]', length($sFmtRes), 3]; $i+=3; } elsif((substr($sFmtObj, $i, 4) eq '[mm]')) { push @aRep, ['[mm]', length($sFmtRes), 4]; $i+=4; } elsif($sWk eq '@') { push @aRep, ['@', length($sFmtRes), 1]; $i++; } elsif($sWk eq '*') { push @aRep, [substr($sFmtObj, $i, 1), length($sFmtRes), 1]; } else{ $i++; } $i++ if($i == $iSt); #No Format match $sFmtRes .= substr($sFmtObj, $iSt, $i-$iSt); } #print "FMT: $iRpos ",$sFmtRes, "\n"; if($iFflg != -1) { push @aRep, [substr($sFmtObj, $iFflg, $i-$iFflg+1), $iRpos,, $i-$iFflg+1]; $iFflg= 0; } #For Date format $iFmtMode = 0 if(defined $sType && $sType eq 'Text'); #Not Convert Non Numeric if(($iFmtMode==2)&& ($iData =~/$sNUMEXP/)) { my @aTime = ExcelLocaltime($iData, $i1904); $aTime[4]++; $aTime[5] += 1900; my @aMonL = qw (dum January February March April May June July August September October November December ); my @aMonNm = qw (dum Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my @aWeekNm = qw (Mon Tue Wed Thu Fri Sat Sun); my @aWeekL = qw (Monday Tuesday Wednesday Thursday Friday Saturday Sunday); my $sRep; for(my $iIt=$#aRep; $iIt>=0;$iIt--) { my $rItem = $aRep[$iIt]; if((scalar @$rItem) >=4) { #Min if($rItem->[0] eq 'mm') { $sRep = sprintf("%02d", $aTime[1]); } else { $sRep = sprintf("%d", $aTime[1]); } } #Year elsif($rItem->[0] eq 'yyyy') { $sRep = sprintf('%04d', $aTime[5]); } elsif($rItem->[0] eq 'yy') { $sRep = sprintf('%02d', $aTime[5] % 100); } #Mon elsif($rItem->[0] eq 'mmmmm') { $sRep = substr($aMonNm[$aTime[4]], 0, 1); } elsif($rItem->[0] eq 'mmmm') { $sRep = $aMonL[$aTime[4]]; } elsif($rItem->[0] eq 'mmm') { $sRep = $aMonNm[$aTime[4]]; } elsif($rItem->[0] eq 'mm') { $sRep = sprintf('%02d', $aTime[4]); } elsif($rItem->[0] eq 'm') { $sRep = sprintf('%d', $aTime[4]); } #Day elsif($rItem->[0] eq 'dddd') { $sRep = $aWeekL[$aTime[7]]; } elsif($rItem->[0] eq 'ddd') { $sRep = $aWeekNm[$aTime[7]]; } elsif($rItem->[0] eq 'dd') { $sRep = sprintf('%02d', $aTime[3]); } elsif($rItem->[0] eq 'd') { $sRep = sprintf('%d', $aTime[3]); } #Hour elsif($rItem->[0] eq 'hh') { if($iAm) { $sRep = sprintf('%02d', $aTime[2]%12); } else { $sRep = sprintf('%02d', $aTime[2]); } } elsif($rItem->[0] eq 'h') { if($iAm) { $sRep = sprintf('%d', $aTime[2]%12); } else { $sRep = sprintf('%d', $aTime[2]); } } #SS elsif($rItem->[0] eq 'ss') { $sRep = sprintf('%02d', $aTime[0]); } elsif($rItem->[0] eq 'S') { $sRep = sprintf('%d', $aTime[0]); } #am/pm elsif($rItem->[0] eq 'am/pm') { $sRep = ($aTime[4]>12)? 'pm':'am'; } elsif($rItem->[0] eq 'a/p') { $sRep = ($aTime[4]>12)? 'p':'a'; } elsif($rItem->[0] eq '.') { $sRep = '.'; } elsif($rItem->[0] =~ /^0+$/) { my $i0Len = length($&); #print "SEC:", $aTime[7], "\n"; $sRep = substr(sprintf("%.${i0Len}f", $aTime[7]/1000.0), 2, $i0Len); } elsif($rItem->[0] eq '[h]') { $sRep = sprintf('%d', int($iData) * 24 + $aTime[2]); } elsif($rItem->[0] eq '[mm]') { $sRep = sprintf('%d', (int($iData) * 24 + $aTime[2])*60 + $aTime[1]); } #NENGO(Japanese) elsif($rItem->[0] eq 'ge') { $sRep = Spreadsheet::XLSX::FmtJapan::CnvNengo(1, @aTime); } elsif($rItem->[0] eq 'ggge') { $sRep = Spreadsheet::XLSX::FmtJapan::CnvNengo(2, @aTime); } elsif($rItem->[0] eq '@') { $sRep = $iData; } #print "REP:$sRep ",$rItem->[0], ":", $rItem->[1], ":" ,$rItem->[2], "\n"; substr($sFmtRes, $rItem->[1], $rItem->[2]) = $sRep; } } elsif(($iFmtMode==1)&& ($iData =~/$sNUMEXP/)) { if($#aRep>=0) { while($aRep[$#aRep]->[0] eq ',') { $iCmmCnt--; substr($sFmtRes, $aRep[$#aRep]->[1], $aRep[$#aRep]->[2]) = ''; $iData /= 1000; pop @aRep; } my $sNumFmt = join('', map {$_->[0]} @aRep); my $sNumRes; my $iTtl=0; my $iE=0; my $iP=0; my $iInt = 0; my $iAftP=undef; foreach my $sItem (split //, $sNumFmt) { if($sItem eq '.') { $iTtl++; $iP = 1; } elsif(($sItem eq 'E') || ($sItem eq 'e')){ $iE = 1; } elsif($sItem eq '0') { $iTtl++; $iAftP++ if($iP); $iInt = 1; } elsif($sItem eq '#') { #$iTtl++; $iAftP++ if($iP); $iInt = 1; } elsif($sItem eq '?') { #$iTtl++; $iAftP++ if($iP); } } $iData *= 100.0 if($iPer); my $iDData = ($iFugouFlg)? abs($iData) : $iData+0; if($iBunFlg) { $sNumRes = sprintf("%0${iTtl}d", int($iDData)); } else { if($iP) { $sNumRes = sprintf( (defined($iAftP)? "%0${iTtl}.${iAftP}f": "%0${iTtl}f"), $iDData); } else { $sNumRes = sprintf("%0${iTtl}.0f", $iDData); } } $sNumRes = AddComma($sNumRes) if($iCmmCnt > 0); my $iLen = length($sNumRes); my $iPPos = -1; my $sRep; for(my $iIt=$#aRep; $iIt>=0;$iIt--) { my $rItem = $aRep[$iIt]; if($rItem->[0] =~/([#0]*)([\.]?)([0#]*)([eE])([\+\-])([0#]+)/) { substr($sFmtRes, $rItem->[1], $rItem->[2]) = MakeE($rItem->[0], $iData); } elsif($rItem->[0] =~ /\//) { substr($sFmtRes, $rItem->[1], $rItem->[2]) = MakeBun($rItem->[0], $iData, $iInt); } elsif($rItem->[0] eq '.') { $iLen--; $iPPos=$iLen; } elsif($rItem->[0] eq '+') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = ($iData > 0)? '+': (($iData==0)? '+':'-'); } elsif($rItem->[0] eq '-') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = ($iData > 0)? '': (($iData==0)? '':'-'); } elsif($rItem->[0] eq '@') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $iData; } elsif($rItem->[0] eq '*') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = ''; #REMOVE } elsif(($rItem->[0] eq "\xA2\xA4") or ($rItem->[0] eq "\xA2\xA5") or ($rItem->[0] eq "\x81\xA2") or ($rItem->[0] eq "\x81\xA3") ){ substr($sFmtRes, $rItem->[1], $rItem->[2]) = $rItem->[0]; } elsif(($rItem->[0] eq '(') or ($rItem->[0] eq ')')){ substr($sFmtRes, $rItem->[1], $rItem->[2]) = $rItem->[0]; } else { if($iLen>0) { if($iIt <= 0) { $sRep = substr($sNumRes, 0, $iLen); $iLen = 0; } else { my $iReal = length($rItem->[0]); if($iPPos >= 0) { my $sWkF = $rItem->[0]; $sWkF=~s/^#+//; $iReal = length($sWkF); $iReal = ($iLen <=$iReal)? $iLen:$iReal; } else { $iReal = ($iLen <=$iReal)? $iLen:$iReal; } $sRep = substr($sNumRes, $iLen - $iReal, $iReal); $iLen -=$iReal; } } else { $sRep = ''; } substr($sFmtRes, $rItem->[1], $rItem->[2]) = "\x00" . $sRep; } } $sRep = ($iLen > 0)?substr($sNumRes, 0, $iLen) : ''; $sFmtRes =~ s/\x00/$sRep/; $sFmtRes =~ s/\x00//g; } } else { my $iAtMk = 0; for(my $iIt=$#aRep; $iIt>=0;$iIt--) { my $rItem = $aRep[$iIt]; if($rItem->[0] eq '@') { substr($sFmtRes, $rItem->[1], $rItem->[2]) = $iData; $iAtMk++; } else { substr($sFmtRes, $rItem->[1], $rItem->[2]) = ''; } } $sFmtRes = $iData unless($iAtMk); } return wantarray()? ($sFmtRes, $sColor) : $sFmtRes; } #------------------------------------------------------------------------------ # AddComma (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub AddComma { my($sNum) = @_; if($sNum=~ /^([^\d]*)(\d\d\d\d+)(\.*.*)$/) { my($sPre, $sObj, $sAft) =($1, $2, $3); for(my $i=length($sObj)-3;$i>0; $i-=3) { substr($sObj, $i, 0) = ','; } return $sPre . $sObj . $sAft; } else { return $sNum; } } #------------------------------------------------------------------------------ # MakeBun (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub MakeBun { my($sFmt, $iData, $iFlg) = @_; my $iBunbo; my $iShou; #1. Init #print "FLG: $iFlg\n"; if($iFlg) { $iShou = $iData - int($iData); return '' if($iShou == 0); } else { $iShou = $iData; } $iShou = abs($iShou); my $sSWk; #2.Calc BUNBO #2.1 BUNBO defined if($sFmt =~ /\/(\d+)$/) { $iBunbo = $1; return sprintf("%d/%d", $iShou*$iBunbo, $iBunbo); } else { #2.2 Calc BUNBO $sFmt =~ /\/(\?+)$/; my $iKeta = length($1); my $iSWk = 1; my $sSWk = ''; my $iBunsi; for(my $iBunbo = 2;$iBunbo<10**$iKeta;$iBunbo++) { $iBunsi = int($iShou*$iBunbo + 0.5); my $iCmp = abs($iShou - ($iBunsi/$iBunbo)); if($iCmp < $iSWk) { $iSWk =$iCmp; $sSWk = sprintf("%d/%d", $iBunsi, $iBunbo); last if($iSWk==0); } } return $sSWk; } } #------------------------------------------------------------------------------ # MakeE (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub MakeE { my($sFmt, $iData) = @_; $sFmt=~/(([#0]*)[\.]?[#0]*)([eE])([\+\-][0#]+)/; my($sKari, $iKeta, $sE, $sSisu) = ($1, length($2), $3, $4); $iKeta = 1 if($iKeta<=0); my $iLog10 = 0; $iLog10 = ($iData == 0)? 0 : (log(abs($iData))/ log(10)); $iLog10 = (int($iLog10 / $iKeta) + ((($iLog10 - int($iLog10 / $iKeta))<0)? -1: 0)) *$iKeta; my $sUe = ExcelFmt($sKari, $iData*(10**($iLog10*-1)),0); my $sShita = ExcelFmt($sSisu, $iLog10, 0); return $sUe . $sE . $sShita; } #------------------------------------------------------------------------------ # LeapYear (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub LeapYear { my($iYear)=@_; return 1 if($iYear==1900); #Special for Excel return ((($iYear % 4)==0) && (($iYear % 100) || ($iYear % 400)==0))? 1: 0; } #------------------------------------------------------------------------------ # LocaltimeExcel (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub LocaltimeExcel { my($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iMSec, $flg1904) = @_; #0. Init $iMon++; $iYear+=1900; #1. Calc Time my $iTime; $iTime =$iHour; $iTime *=60; $iTime +=$iMin; $iTime *=60; $iTime +=$iSec; $iTime += $iMSec/1000.0 if(defined($iMSec)) ; $iTime /= 86400.0; #3600*24(1day in seconds) my $iY; my $iYDays; #2. Calc Days if($flg1904) { $iY = 1904; $iTime--; #Start from Jan 1st $iYDays = 366; } else { $iY = 1900; $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) } while($iY<$iYear) { $iTime += $iYDays; $iY++; $iYDays = (LeapYear($iY))? 366: 365; } for(my $iM=1;$iM < $iMon; $iM++){ if($iM == 1 || $iM == 3 || $iM == 5 || $iM == 7 || $iM == 8 || $iM == 10 || $iM == 12) { $iTime += 31; } elsif($iM == 4 || $iM == 6 || $iM == 9 || $iM == 11) { $iTime += 30; } elsif($iM == 2) { $iTime += (LeapYear($iYear))? 29: 28; } } $iTime+=$iDay; return $iTime; } #------------------------------------------------------------------------------ # ExcelLocaltime (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ sub ExcelLocaltime { my($dObj, $flg1904) = @_; my($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iwDay, $iMSec); my($iDt, $iTime, $iYDays); $iDt = int($dObj); $iTime = $dObj - $iDt; #1. Calc Days if($flg1904) { $iYear = 1904; $iDt++; #Start from Jan 1st $iYDays = 366; $iwDay = (($iDt+4) % 7); } else { $iYear = 1900; $iYDays = 366; #In Excel 1900 is leap year (That's not TRUE!) $iwDay = (($iDt+6) % 7); } while($iDt > $iYDays) { $iDt -= $iYDays; $iYear++; $iYDays = ((($iYear % 4)==0) && (($iYear % 100) || ($iYear % 400)==0))? 366: 365; } $iYear -= 1900; for($iMon=1;$iMon < 12; $iMon++){ my $iMD; if($iMon == 1 || $iMon == 3 || $iMon == 5 || $iMon == 7 || $iMon == 8 || $iMon == 10 || $iMon == 12) { $iMD = 31; } elsif($iMon == 4 || $iMon == 6 || $iMon == 9 || $iMon == 11) { $iMD = 30; } elsif($iMon == 2) { $iMD = (($iYear % 4) == 0)? 29: 28; } last if($iDt <= $iMD); $iDt -= $iMD; } #2. Calc Time $iDay = $iDt; $iTime += (0.0005 / 86400.0); $iTime*=24.0; $iHour = int($iTime); $iTime -= $iHour; $iTime *= 60.0; $iMin = int($iTime); $iTime -= $iMin; $iTime *= 60.0; $iSec = int($iTime); $iTime -= $iSec; $iTime *= 1000.0; $iMSec = int($iTime); return ($iSec, $iMin, $iHour, $iDay, $iMon-1, $iYear, $iwDay, $iMSec); } # ----------------------------------------------------------------------------- # col2int (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ # converts a excel row letter into an int for use in an array sub col2int { my $result = 0 ; my $str = shift ; my $incr = 0 ; for(my $i = length($str) ; $i > 0 ; $i--) { my $char = substr( $str, $i-1) ; my $curr += ord(lc($char)) - ord('a') + 1; $curr *= $incr if( $incr) ; $result += $curr ; $incr += 26 ; } # this is one out as we range 0..x-1 not 1..x $result-- ; return $result ; } # ----------------------------------------------------------------------------- # int2col (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ ### int2col # convert a column number into column letters # @note this is quite a brute force coarse method # does not manage values over 701 (ZZ) # @arg number, to convert # @returns string, column name # sub int2col { my $out = "" ; my $val = shift ; do { $out .= chr(( $val % 26) + ord('A')) ; $val = int( $val / 26) - 1 ; } while( $val >= 0) ; return reverse $out ; } # ----------------------------------------------------------------------------- # sheetRef (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ # ----------------------------------------------------------------------------- ### sheetRef # convert an excel letter-number address into a useful array address # @note that also Excel uses X-Y notation, we normally use Y-X in arrays # @args $str, excel coord eg. A2 # @returns an array - 2 elements - column, row, or undefined # sub sheetRef { my $str = shift ; my @ret ; $str =~ m/^(\D+)(\d+)$/ ; if( $1 && $2) { push( @ret, $2 -1, col2int($1)) ; } if( $ret[0] < 0) { undef @ret ; } return @ret ; } # ----------------------------------------------------------------------------- # xls2csv (for Spreadsheet::XLSX::Utility) #------------------------------------------------------------------------------ ### xls2csv # convert a chunk of an excel file into csv text chunk # @args $param, sheet-colrow:colrow (1-A1:B2 or A1:B2 for sheet 1 # @args $rotate, 0 or 1 decides if output should be rotated or not # @returns string containing a chunk of csv # sub xls2csv { my ($filename, $regions, $rotate) = @_ ; my $sheet = 0 ; my $output = "" ; # extract any sheet number from the region string $regions =~ m/^(\d+)-(.*)/ ; if( $2) { $sheet = $1 - 1 ; $regions = $2 ; } # now extract the start and end regions $regions =~ m/(.*):(.*)/ ; if( !$1 || !$2) { print STDERR "Bad Params"; return "" ; } my @start = sheetRef( $1) ; my @end = sheetRef( $2) ; if( !@start) { print STDERR "Bad coorinates - $1"; return "" ; } if( !@end) { print STDERR "Bad coorinates - $2"; return "" ; } if( $start[1] > $end[1]) { print STDERR "Bad COLUMN ordering\n"; print STDERR "Start column " . int2col($start[1]); print STDERR " after end column " . int2col($end[1]) . "\n"; return "" ; } if( $start[0] > $end[0]) { print STDERR "Bad ROW ordering\n"; print STDERR "Start row " . ($start[0] + 1); print STDERR " after end row " . ($end[0] + 1) . "\n"; exit ; } # start the excel object now my $oExcel = new Spreadsheet::XLSX ; my $oBook = $oExcel->Parse( $filename) ; # open the sheet my $oWkS = $oBook->{Worksheet}[ $sheet] ; # now check that the region exists in the file # if not trucate to the possible region # output a warning msg if( $start[1] < $oWkS->{MinCol}) { print STDERR int2col( $start[1]) . " < min col " . int2col( $oWkS->{MinCol}) . " Reseting\n"; $start[1] = $oWkS->{MinCol} ; } if( $end[1] > $oWkS->{MaxCol}) { print STDERR int2col( $end[1]) . " > max col " . int2col( $oWkS->{MaxCol}) . " Reseting\n" ; $end[1] = $oWkS->{MaxCol} ; } if( $start[0] < $oWkS->{MinRow}) { print STDERR "" . ($start[0] + 1) . " < min row " . ($oWkS->{MinRow} + 1) . " Reseting\n"; $start[0] = $oWkS->{MinCol} ; } if( $end[0] > $oWkS->{MaxRow}) { print STDERR "" . ($end[0] + 1) . " > max row " . ($oWkS->{MaxRow} + 1) . " Reseting\n"; $end[0] = $oWkS->{MaxRow} ; } my $x1 = $start[1] ; my $y1 = $start[0] ; my $x2 = $end[1] ; my $y2 = $end[0] ; if( !$rotate) { for( my $y = $y1 ; $y <= $y2 ; $y++) { for( my $x = $x1 ; $x <= $x2 ; $x++) { my $cell = $oWkS->{Cells}[$y][$x] ; $output .= $cell->Value if(defined $cell); $output .= "," if( $x != $x2) ; } $output .= "\n" ; } } else { for( my $x = $x1 ; $x <= $x2 ; $x++) { for( my $y = $y1 ; $y <= $y2 ; $y++) { my $cell = $oWkS->{Cells}[$y][$x] ; $output .= $cell->Value if(defined $cell); $output .= "," if( $y != $y2) ; } $output .= "\n" ; } } return $output ; } sub unescape_HTML { my $string = shift; my %options = @_; return $string if ($string eq ''); $string =~ s/"/"/g; $string =~ s/’/'/g; $string =~ s/&/&/g; return $string if $options{textarea}; # for textboxes, we leave < and > as < and > # so that people who enter "" into # our text boxes can't break forms $string =~ s/<//g; return $string; } 1; __END__ =head1 NAME Spreadsheet::XLSX::Utility2007 - Utility function for Spreadsheet::XLSX =head1 SYNOPSIS use strict; #Declare use Spreadsheet::XLSX::Utility qw(ExcelFmt ExcelLocaltime LocaltimeExcel); #Convert localtime ->Excel Time my $iBirth = LocaltimeExcel(11, 10, 12, 23, 2, 64); # = 1964-3-23 12:10:11 print $iBirth, "\n"; # 23459.5070717593 #Convert Excel Time -> localtime my @aBirth = ExcelLocaltime($iBirth, undef); print join(":", @aBirth), "\n"; # 11:10:12:23:2:64:1:0 #Formatting print ExcelFmt('yyyy-mm-dd', $iBirth), "\n"; #1964-3-23 print ExcelFmt('m-d-yy', $iBirth), "\n"; # 3-23-64 print ExcelFmt('#,##0', $iBirth), "\n"; # 23,460 print ExcelFmt('#,##0.00', $iBirth), "\n"; # 23,459.51 print ExcelFmt('"My Birthday is (m/d):" m/d', $iBirth), "\n"; # My Birthday is (m/d): 3/23 =head1 DESCRIPTION Spreadsheet::XLSX::Utility exports utility functions concerned with Excel format setting. ExcelFmt is used by Spreadsheet::XLSX::Fmt2007.pm which is used by Spreadsheet::XLSX. =head1 Functions This module can export 3 functions: ExcelFmt, ExcelLocaltime and LocaltimeExcel. =head2 ExcelFmt $sTxt = ExcelFmt($sFmt, $iData [, $i1904]); I<$sFmt> is a format string for Excel. I<$iData> is the target value. If I<$flg1904> is true, this functions assumes that epoch is 1904. I<$sTxt> is the result. For more detail and examples, please refer sample/chkFmt.pl in this distribution. ex. =head2 ExcelLocaltime ($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iwDay, $iMSec) = ExcelLocaltime($iExTime [, $flg1904]); I converts time information in Excel format into Perl localtime format. I<$iExTime> is a time of Excel. If I<$flg1904> is true, this functions assumes that epoch is 1904. I<$iSec>, I<$iMin>, I<$iHour>, I<$iDay>, I<$iMon>, I<$iYear>, I<$iwDay> are same as localtime. I<$iMSec> means 1/1,000,000 seconds(ms). =head2 LocaltimeExcel I<$iExTime> = LocaltimeExcel($iSec, $iMin, $iHour, $iDay, $iMon, $iYear [,$iMSec] [,$flg1904]) I converts time information in Perl localtime format into Excel format . I<$iSec>, I<$iMin>, I<$iHour>, I<$iDay>, I<$iMon>, I<$iYear> are same as localtime. If I<$flg1904> is true, this functions assumes that epoch is 1904. I<$iExTime> is a time of Excel. =head2 col2int I<$iInt> = col2int($sCol); converts a excel row letter into an int for use in an array This function was contributed by Kevin Mulholland. =head2 int2col I<$sCol> = int2col($iRow); convert a column number into column letters NOET: This is quite a brute force coarse method does not manage values over 701 (ZZ) This function was contributed by Kevin Mulholland. =head2 sheetRef (I<$iRow>, I<$iCol>) = sheetRef($sStr); convert an excel letter-number address into a useful array address NOTE: That also Excel uses X-Y notation, we normally use Y-X in arrays $sStr, excel coord (eg. A2). This function was contributed by Kevin Mulholland. =head2 xls2csv $sCsvTxt = xls2csv($sFileName, $sRegion, $iRotate); convert a chunk of an excel file into csv text chunk $sRegions = "sheet-colrow:colrow" (ex. '1-A1:B2' means 'A1:B2' for sheet 1) $iRotate = 0 or 1 (output should be rotated or not) This function was contributed by Kevin Mulholland. =head1 AUTHOR Rob Polocz rob.polocz@trackvia.com based on work by for Spreadsheet::ParseExcel by Kawai Takanori (Hippo2000) used with permission =head1 SEE ALSO Spreadsheet::ParseExcel, Spreadsheet::WriteExcel =head1 COPYRIGHT This module is part of the Spreadsheet::XLSX distribution. =cut Spreadsheet-XLSX-0.13/Makefile.PL 777 0 0 1162 11130411750 11501 0use 5.006000; use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( NAME => 'Spreadsheet::XLSX', VERSION_FROM => 'lib/Spreadsheet/XLSX.pm', # finds $VERSION PREREQ_PM => { 'Archive::Zip' => 1.18, 'Spreadsheet::ParseExcel' => '', }, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/Spreadsheet/XLSX.pm', # retrieve abstract from module AUTHOR => 'Dmitry Ovsyanko ') : ()), ); Spreadsheet-XLSX-0.13/MANIFEST 777 0 0 523 11262557372 10661 0Changes lib/Spreadsheet/XLSX.pm lib/Spreadsheet/XLSX/Fmt2007.pm lib/Spreadsheet/XLSX/Utility2007.pm Makefile.PL MANIFEST This list of files README t/0____________use.t t/1_____loreyna126.t t/1_____loreyna126.xlsx t/2_____with_chart.t t/2_____with_chart.xlsx META.yml Module meta-data (added by MakeMaker) Spreadsheet-XLSX-0.13/README 777 0 0 1134 11033444116 10412 0Spreadsheet-XLSC version 0.01 ============================= Spreadsheet::XLSX - Perl extension for reading MS Excel 2007 files; INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES This module requires these other modules and libraries: Archive::Zip COPYRIGHT AND LICENCE Copyright (C) 2008 by Dmitry Ovsyanko This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. Spreadsheet-XLSX-0.13/t/ 777 0 0 0 11373732562 7727 5Spreadsheet-XLSX-0.13/t/0____________use.t 777 0 0 1001 11107211274 13212 0# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl Spreadsheet-XLSC.t' ######################### # change 'tests => 1' to 'tests => last_test_to_print'; use Test::More tests => 2; BEGIN { use_ok ('Archive::Zip'); use_ok ('Spreadsheet::XLSX'); }; ######################### # Insert your test code below, the Test::More module is use()ed here so read # its man page ( perldoc Test::More ) for help writing this test script. Spreadsheet-XLSX-0.13/t/1_____loreyna126.t 777 0 0 617 11122360056 13064 0use Test::More tests => 3; BEGIN { use Spreadsheet::XLSX; use warnings; my $fn = __FILE__; $fn =~ s{t$}{xlsx}; my $excel = Spreadsheet::XLSX -> new ($fn); ok (@{$excel -> {Worksheet}} == 3); ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'POST_DSENDS'); ok ($excel -> {Worksheet} -> [0] -> {Cells} [112] [0] -> {Val} eq 'RCS Thrust Vector Uncertainties '); }; Spreadsheet-XLSX-0.13/t/1_____loreyna126.xlsx 777 0 0 74002 11105501576 13663 0PK!q9+p[Content_Types].xml (̔MN0H!%nj?Kؓƪc[g PTDQ4f|[d9g#NiCz*a|v~6}y-欌pJ`t6i5lDV,D"5<qFz,m k "RrkBKPN+Zjqg[ 2Y+wBMLDq}̨iKǡ]?wVoέNMUB}%-iփ@\J=IB̺iޛ1"o^AAGc,ER'?_rM?;67PK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK! (xl/_rels/workbook.xml.rels (j0 }qne:A[&Q6'o?C@.$}?ЧjU%)Z(8>< ֶҝ`@CqNsD$%襤`)qm.cuy Wo(A5ڻc^ C 9ZrJ-L=]IӎR2,{/ wOh:6@]nݽfyX3|]$ر.EDݠٟ +QKrr+,dg/3PK!%Sxl/theme/theme1.xmlYOo6w tom'uرMniXS@I}úa0l+t&[HJKՇD"|#uڃC"$q۫]z>8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ K(NhwŘQ6㶷 [SYJ(p»g>X_xwu{\>k]Xy}钣M26PsFnJ'K,}䇦$Ǵ;@` >*8i"LI%\ xӕ=6u= r2f 3c (:jZ3sLs*UܚЅ ]M8kp6x"]$C<&>'eb. vJ|yXɾ8Ȯ]7R /=,.&'Qk5q&p(Kaݐ Sd›L17 jpSaS! 35'+ZzQ H )7 5)kdB|UtvaDξp|Fl&0_*3n'LE/pm&]8fIrS4d 7y` nίI R3U~cnrF:_*P}-p Tpl rۜ4LZéO !PLB]$K *++65vꦚeNƟf(MN1ߜ6&3(adE,Uz<{EUϲV)9Z[4^kd5!J?Q3qBoC~M m<.vpIYӦZY_p=al-Y}Nc͙ŋ4vjavl'S&A8|*~x1%M0g%<ҭPK!JK-xl/worksheets/sheet2.xmlPJ0 CMWY",m'm$YW޴eyyo^jĘ E }K} o۫{%5|cusyQ)Ӏ";TVRv@RA}f4E8"nZrV^txV?iqC$UO 3Ȧ0xLf1G⩫v;xC_8Wp*+RV(|TV(PJSYB)#B)eRNeR :J)+RV#6!ƤB?;QjQcRV(PJYIJYB)e5&)eR ՘J)+RVcRV(PJYIJYB)e5&)eR ESF4_k,.(,AxضGq[TϾ+gJ +gJG+gJ+gJ+gJ+gJ+gʞįqTfxP$mn',t²I'v²I',tbn',t²I'v²I',tbn',t²I'v²I',tbn',t²y\ܦQaZ&qA\\$?ż=y z#1f:~"^,L3F'>}BTZ& #ω$CRPO|gzfto`F|cqg/+\%N,"c)@+v! nNk8aNipR_I} '5aQJ.SYņa6ruCiE:6-&F@4:)I:!AB3hIHݶ:Lm)tB')LȡiK:LqԖB')tJquKO4Je ѢcH‘G-[8ҿnѷpoHÙM[H`1qo#k3[8ҷp/Ǘ˄Wlg6,C܄ #q9&M˲;M05w07a$. 7a$nH췁 v#ī5cKܥ/qyoX]O7q;L4,nEp[IͰ8L27y<ze qZ)r8{Z<?!Y!Y$4k3Px^1jG #ع3u+r)鮞B51]eF>)-<ɭ\Zz K.Xdf/(tlӇZ[4;Bt؇(c` {7`wVnI(eҀ21\̒9.阎|L$(r=߷`Dc#DUS~'=LKFHe}y 4w|EY*68mNxZ[6 xi/z`d2In9-깣a)bC8oaĩ ˍ"emT4NdYGC;,NKTn vVaFe3F[z^JWܓanSYy SXө&_F6\Fʽޕ^?'45>U (fJh}F볼-1p.H0Z_`q$>NII UTHJEa6Ɨ}.6[O0oyAwNW1P#*j͢\ Z@'a0,eY"=zug9T6k^SqQǢٲڵQߍ4[B%O~ kŗ%ǞG^ ^9ϊ\'{7%Sziay>fp" A",ayz+Xhd+5 VZܟ| (_C+z ec%c5+@ $Ic5+vIAMd1V2noIAMd1V2IAMd1V2yė@j,&YҜ%i:t:+ Ekp ! mc1NRQZېjn`5BuUJF(i1xC17t1!7o(f741xCsRA@ !7o B5xcPCHAPjc 7ooYo ji1xcJ#A@ !7o B'|X"K^!F揃Wh,lfUs;zyAç<`>yK#LǾ!&dy-~?}9<+ܽg'R#am^~]V~%c1 ~|t< <'OOa>Q9<%Q\J1v` ;m^lHHzu(_{[|2i\޼YjiX"7ْxe7OWzP~itpy0~^.?.k3ݿn+%Y;OA47p s}PJկA_O>dfaaG֑6l4R^-:W覧ofwk(GTg0ex4nGz /zG !{t8_zm`WtR.1<:䱾&zok<;" ~o OgoB?66gÉo5c[\I#S̘ T=2Qznu!k,ۆV.Nݩq0m}d#/Nvk hUݎFnmຶ1p$p|'cUǒ 1ǔF1}ZxQ>prx +f}CP~Ħ`#fؤͫͩq|ͅ{MlfLe t}jj&MgՀil6Z6cj`sj6asgSb*S>55ILRĦj4j8l#5 >S̘8Ib$6_M=kxl^L 6R㰹p)1͌7>55ILRĦϚ"WoScRTl`؃;^P,\UglF"y-"YMZħH|:nb.s9[uv5Y|F|R絈|j*|ZħH|:\>+1`ޚpMdjI-""򩵪i5R#p'\΃ye7Y\^g'|^ȧ֪§H|Jħub.s9- dqyMѪ"y-"Z V#)5ׁϊ|r+1`pMdjI-""򩵪i5R#p'\>daoQ.Cpbtwz4̃kZ\R?=E XV 6}/txݱH{rta#V [wwf-Dѯ>t7Kq6ey9?|BHiTo>{x0~dQ5i=D꘮/^ .ڏ[o )xہlx%w+=:>{Bt~Աm{. K%t:owwm,Ht9vL{J_PK!~J<* xl/styles.xmlZ_o8?CN- RvCս 1`cG~)IIAP3f<363xHI1tKuɀa|wD.G2HԆɒR ݥRѻN'-iHKQeD1%ABz^&@qg&WB ~6o> \u ;,ޥ۱Ko(=EZCxE_ 5DzڷU^ͻFs)hp }Ts& !5wi̐lNB7f%R `Ǭ`Oʮ䜿8 Tr.1(2ncFK>~}e^R蚢s.)_b4ge:X$ls_Ɓ "JXI6Xc vP/boOH$gJyLBA-HDڅڮ(2 \H5h\1[,SJFR;~LчZ{R 0]E҈D77U* (TyඞrBaGnh02/]ݤ>0MU(/pJNZ.=:)-g RLpKEgJxPmH0+6УKF;F :9MIkkuc^hLI (ӫ b0co?fVK}Л4vc=е^ 7Vxư)-̶]ھK]BN~O[@{ȀmdP\ em>n җӱ-tNs ֥7)GD6ڊz;cL Ir9mʈtێ*ހRxP]$ܶi,T_Qm8&O%V=|{PSEU*LڹS={- ڢp=[?s:KYU:{UdsΘ\IOP{WD|c5W:ۼuͦ'N|;r }pVm!fZ%{#@%CD}:#mZMvA}qTM;ʙȥ">Z8<㨠 (vVZ}HxASuR+:G: ƎM.'4Ŝv 7V+&hc9_ Ov ߼ۏ'΄΅arq3';*@`%B%vd WٗC7L !cTQ*bamMI9PK!2Cxvxl/worksheets/sheet1.xml}]FPԻnhݷ|nt-ٞ{HY.O `_~~߾|뇗vy_>ϗw_~Ǐ?~y/?~}+O_w|凟^__>~_^?闟_>~\w]?~yko?_|폟oɡwx/|m?^?_~˻ڟ>dWw\K6HO/?;2 o*BgFۻ_o?__?姯үg)M˻_>{ӧe[oM>oi^gLɴ뗯)]/D-п/SsuMg~>_1eQ!,@`ƪ7|w%xcp ^kWC<.Q@sdfT,h!a-Һ.%b$x{|Oe-9#ZT> Ep C ]–)NI@8'n!lgh$(Z菜9ߖ8ǽH9,yq7EO6S~,m{c{O];\FLOȆq[:M^  Qj&N,;i|}܏}iH> S(lK&ȩ{K Qjbz$k(ɈfD[ 1*YN;[D6W=wXIgx%&!0s◧S- e)ԾmMWhVjk5sFrY0B)iF6U>ɕ{.-5}O˲rH_ zHf'Y娇l6{6)\娇6{R-D/!e 3ȆCfYB:utF6zǗղF6}ƗղF6ףRʮKKgdhltF65e ,[h[:#UFYB:p/օKf`[6c3:/Li;ynHIKHg€[:c>c?yɢPkg [>cvf )9CZ[ְ]h5apq?7"kkB{Z^c7=dlVrev⎍й2<鸇z[-MzN0!ŭVErlk $0[kՒ4_b5la24˶ۘGL4-|ʬMo!e Ycv"o!e nym"o!e niml#B۰Win46 ~᷐岅ܲ0;\0F/\0؆=sf9mb!la<6~){HqB؆/R\0S8dpxCJR4!e f)lص摶v-Sn)l ExC3KQdq\݁v-W^$8_q' !@{-M#dla|,C6Q Ukn)Ȇ9\GH# Y!pe!d fyl8}4- 6#dhcB&5$dhӐ%JTB6K!d fll3dlNu&!8gH%Y*!0!€Y&!kXTHϐILB65CBaim$#Y<ɒBslZ= 64pze8*po RV1[ҪV!OŴDU(,5=M.ʊ吽/ D9NJ;U吤/pq"Yuk{ {Hӓw/Va#W͔Ou~5# E:ID7x1]M]Usiρ*d/>gpF۸'@ t811D^uβsnשm/f! QWU_@$ %LPՏ-H4lE…\(''- BެX@]+:nGgy#/\ua>f,,:i°D^ 0)VsXdhǴ_djG>f6V+XW}5F_^uY1P՚NHjE5H(`h X<OYs%Ц``WȪ_>f w?9ǨjȡFē= 96' Y 5S$"b = H!d-ǎ }"P[ U-(TGnWSZfs*HUrqlБ"uR9VTd~ #@簌`8莧q[~轅yBpr5è+FGc+`tX{ʘ^Fd,u޼N`rs);p[ gGZ=:?Pg?Ȋam>QeDYu\P [eY+kr j R7f2$+PUub<h֗ '/^I֔A9fR*FIiV0#6:(f1km5B]9WP6MþR â' ˕|L/yN%YfiO(t&,(gtW\3zB'NȪ 2.7RPbOh)m~-lƸɨwS8̧ʣS\w9<:. 1 M hige蓥Qj tyP,1B2A^f1ǣwHiԂiUpLUsAH ]H]W$l{adt.ެDeX8K5/E\%|kx8Uͯd#\<ڷ}˷y=/2+e@1NUbت}W@GSkA)rUJ*;?ۉ?"uf[3(] rמT3Y[ *"@R Р4a2Unm?F.bbIuV2ۃP|ncB8SXŪr*k`E)J!@+&3k@ґ:%v!P<1^K_p 긅(1p K_*AIhӟ Z7@p*8urFub$)rVI6DlфHq s!jT#tjTb\" Fm/>,o1z;1sҧCQsZϸV\¶S0;2tŐ{j[h HGv q @ (ېv-ۢZӒJ;'V!8Uy{SSPyd' OELGm (AsYA+k P0}]4{oƬbj48 OGA*>0lcH5!]@" (0`"@,-8@١ ,VIL$PN:R!.ס.sBh&[蘆b@4]@*@Z@]HK7ӣ pNm +q3eYUGSE PR  *yk0+rcgVuaGDdDĚ\(3VD$"jA;Լ`d45!%']HKdxdZ7mÀa)wBZpHyYǫfXEnlԿ=Yێ A\CZ wЩDx!p ;WKiHWAQYw#3Ԍ5OqkXw)aB^> 1߱X; #S,څE mȊa::d ^P!áPh3mxd%θ kMV$+%wy yu|_Y 8:#bnIޑåf}3*oV  =^6څ9.hw-1+<{ ƕ˘Ȫ97 Te計9 )iZșA30f!V,+ sGsmwat9&%鉗͆C;dE┒S?ϕ,!:;B'a^H\0= +[ny!fRMH2>TĪd5WIUrcnba&=&''+DDJk՘\Śe5UdUp9暼c9*+TXlEY,=~ps$CFaUC,bWV (:b<3%Cyd*QѲ`,f!u&=\߿6ʘiH`Ӑ'DC*c6:!+1цPK]@(M {A%y[)sCzA<ʼn~=;ۇZk\YQ YU|nɦpwrȓ{Tƴ7㨆"GceopTc}}0㈸Qáq8u=?)G #\BNV5zcy-=Y,x4'9Wt`gVlX ~V$l{Ї&I$z 3HG苬j0\idap`Ek|GldUOY˺Ώ+usbpwNcb$}Ǔ^4{J)G _Wr?:[klW06Q3y };:#Ml-똰ɪtNNpZiE-77)PMUtԉP#g2w%kD0@]q YUKכ`^kOX3;7ݎu= xO@Wg ~tG= j\JVu.ޱēv rKCf!AŖtwܕW?f?j3؏ 3JE\'BiU D-*Qr<:@(1 YU6!@8 ԝY-}e 79UK|> R7' .BOcA(q}p٠8жI\]q H qm.nB<4'p|m8϶I\LUbU][U/>w7<_6OiOYמZ%{{v&OhW=jUbfp6έs>+&HX JgsqFM H:;AGfo<ֺȴ50R`zaMΘ:<ש\a g9fVJܲGD72q_ހki hpIt"p: h8KB8:#“q;:Ҙ{[)`ŕQ-)yl;qGφfq/ŗ[J";gn'6nAب Jjx@D|Ww#ltT|SfxƖ; : -nL 8н< z^¢ib.!d{8w@ }h iD!$FTׂUerZf`b;mXGŕLi+Ԟd\u0vY#i =n#*ɨtL4n=[WFqAi5O1lbfu !籅&ձYnn.5994k6fN 6n3D&>m)Ͳ8 D{wj21;\&/tƏ6nh10TL$a0t#J"(;T"lb# b5]B~⼪bGPvJ7f h8I7x1_㹊(cv"v1='4=AF͘#Rqp(H hlڽ(qyLۀu(Fueq4mj )t rD!c4ω96*R-77DZ%jvN2:=%>5qH`o@_иU8 Q[T,{s 3nkPI{0a>r>YנfX~TSM"A}r$Vf%O5tA PL-f@;cV>C_{*ɠ}.vȂ2:"E%YBFԱ $R,(wXU4Vc7[XN4f$>H_y܈)XCdgkPHdv%zZU Hisb+vɂ1X!HHNsr] o,hc$O-Mn3GIKNbFN2wTҳ_'G_ }e ӃJ Ku1 9!I2^"ֺ㔵Pz ULh4i$b"Cs|0R@dEu)dt/y(OCÄZ߿81d&y JwIbekd"yTY㫊R;,f6i \! ոq~itx|^ 31eY<ЃPiLq1Jї.cuj, )dbV/ \$Q7j.2{3Rv|ΧCo,[ kCrm)L/Od7΃@7|Eu䝊jqn>FD #/c| TQ.s]^E#y߿5cf Ȭm˕#fXδӉi 72?4{>p>N>߿z2cf rA|z;Y~0f2< ųR 9>֩#p=qFf5ci'7kZj_eX~NO%PY1MOHyn|vFf DxPV̕ηX)f ȬE&Vo?7#ӞyIiɍґgZd]%C4$fȌm⩤/C~ϊdKs3GtdNFt騍u_c 5elUdPO,}#Y@P_g!֦#sg x5+v33#ṉd ]YqNOn5$=7#pGf4 M|\R86VO>\c>q:7R RA8#Kq?/7#p'3۟tk::@:#Z$$Xsqe1݌A1~)$xJȠK)|g^䛣LG@jPC3 < -8O bb]-ڛ d<^ k{_6fd<E7Ҏ'8߫|jL<{(f! Aχ/,<3#&J#'bdrOCzqh7 jg|}lV#5d?w:=&3v+%vlie1p/ɬRf0G~wy~3 5h c~K咼yːŌBTwQ{c $Ha=1ܞ;\y㈹iZpֆO]4Q)҄@Ǽ~]w:ߌ@GPĄFHGhdVy]z zhxX Q5+J=,5qg8]>K bLo$>oஙV(eFϗ\=Gfwh۟G#]5'~%L\GB|:2qkxkt 5 Qoڟz5So  KjpV621=hxz2/eDv$7~*fK' o:SMl57idMOxgx4 'ڌS={+)M6q_$9qoH'i <{dHUA6Cw$i{f1QKaPʺCGGtr%[]݀̋q:60N;j#3J *x<1玀 {\8wd|ElQgRH, h92Yn>=).(>WM+ws O(YM8 =[|GxCCz5O o: _fwL㪎;0*k> AAY bLutqUuq[?j3*h#92/7h &Y|gqzLY4g4 qG fV;mE=nsGt ;w4˒01q?tlFfZX3;,1Kޠ H׭2˨iA渌{,(/f22Uqo`ܭ[QCsov\Ƈ51qN5ed0zVwFfY.2z WȼRYY;*\glzcp\Gf5CFϭ ϗX7ct6م 4PbtFf5=>5@``mI 4^ǥүŵ;NNMZ>tJ62?f7o3xQX>?HuwFWFoOl4P -v=! {òa ͱz ,uE@_Ziyݟ-[1NƤtItaz  BY2f^Ghli\n\ ql19Z2йM'godf3auY2pUdP6 x9iDŽ\b56}Py*m {x6dKȰ0IZ|zA*#K,nB73@ڡfyVeFWp^0(!dh|4ARV"%9ۊQbaozȌcg8qde<{0׺r>Tīt' ay@xN^{*ߵ찎!^#v}|10,muH dLm.t_8؍}>%餴$12c׶'=n k qS+tg,M=U>= GGð>8#i>x0~s^kksc ~q&1Z0zA{9 Ue h gˉf πq¹na8l] TcAy'gRL^O];qGA & Ȍe8S]pNSDŽ,z8~ҷDŽvUĭzI>21eIG513m}= mE]8=#H͙S(&SGO*NI>kC-i&#>` Vi㎥X.YY>X-3A}+Ơ#5 (, 00`EAC ELzy]URGuyQ~?|a0Bv}o&1z_y|5}ԭH|iљ䉜)jBt3EN̸Pv "uZH&9oqt.qTD_-[K,CmBaL&mAg$Hާn5],gό$edP6y?P^oiHwCN/q BTͼuql'hP !}RdSƗM3nfUv&y  -~Bys0y8Q xG$dcD;.:GP7s6+^ 5!,()Ͳ`5 >ą Xes|06)ZqB4˲>ymLIqr.}օUN3B焙*͠_JoT pD>ɠD~?p Of{0C00Cc] 8VL kgTˋ8rK.<*3/ Uem&L ̰ X&OAbk|=p!5駣ff-91ty(\帏SC&Sv!'U0) ؎H$,w6y$YJKUi| %Ĥ! )q9npfgPus>7<7nIi~t}7*Bj JQؙ 8nLJ"qcu<N_|Uwuؐ.a*WC8 ͸p!x`0&RP3gkPzy1AU"_hCX0ϝmE|c1GO(:,7b)dA]} Xb]y٧Յ c C3!]P-,?fB)]q"iW7ʍ)eG>x !\9ڀ oEfC~F9</ʐ_tIDla=~z]4 r:ߠls!xh,n&*1@B}dH$UeЬ7%5x*^.)|p)FߤX]?^۷~z9?]_~>?cc _o/{WtvO?7妿?=\E;OPK! 2BkdocProps/core.xml (_O0M¢XfO[bޚiiNƷ|=zMAV'[*CqDPעTE7pdE5嵁GSk0x cw Cyq[ɜ?k?X8!KpL0p HDG#RMP,{i蕉Sվ1- -Gc4Q3c1~]a]q@y*8MZł7ث"bŬ[oKwo"DѡIy?l(aLBrI%?滨Å<*O IZY`@v+߿D2YpX(8GBpdNQJ16^v/#= 'C69zziO!$`)>`Vn)=+\ d.<VX6"~.{PжDU|Jc[Bp ֫h5Mۀ_ <5L1cAތ )l &$\"V,CUA|3'& gPVϛCpˁi_mVk! q/*QM\E٪uZQ?}ZBɺUnoax7OE\5@PK-!q9+p[Content_Types].xmlPK-!U0#L |_rels/.relsPK-! (hxl/_rels/workbook.xml.relsPK-!M#kvxl/workbook.xmlPK-!%SB xl/theme/theme1.xmlPK-!JK-xl/worksheets/sheet2.xmlPK-!JK->xl/worksheets/sheet3.xmlPK-!gjJ?zxl/sharedStrings.xmlPK-!~J<* &xl/styles.xmlPK-!2Cxv_,xl/worksheets/sheet1.xmlPK-! 2BkodocProps/core.xmlPK-!6LrdocProps/app.xmlPK tSpreadsheet-XLSX-0.13/t/2_____with_chart.t 777 0 0 1075 11162436454 13350 0use Test::More tests => 6; BEGIN { use Spreadsheet::XLSX; use warnings; my $fn = __FILE__; $fn =~ s{t$}{xlsx}; my $excel = Spreadsheet::XLSX -> new ($fn); ok (@{$excel -> {Worksheet}} == 4); ok ($excel -> {Worksheet} -> [0] -> {Name} eq 'Tabelle1'); ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [0] -> {Val} == 1); ok ($excel -> {Worksheet} -> [0] -> {Cells} [0] [1] -> {Val} == 10); ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [0] -> {Val} == 2); ok ($excel -> {Worksheet} -> [0] -> {Cells} [1] [1] -> {Val} == 20); }; Spreadsheet-XLSX-0.13/t/2_____with_chart.xlsx 777 0 0 24331 11162235662 14121 0PK!싫[Content_Types].xml (UN0#(q[$Px4V򺯿ghF*%%;3;;LQ[q2bi6/_{aFHgWFTm0eys9ГR+\htǥ5LCf7ൂh!|x%}As'ǢǦNpRRηF`mi MI\I vS`*t EҀ "D{r1C֚Pe>aCw_X+;I)9>S&ק)P^(4! nq+P#HAC7}WB^&5|e-a^tC^\, g?oshښvEHz8? /WU.2PK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK!A^xl/_rels/workbook.xml.rels (J0nvut/"U)&%3v]Y^!fֵ5)Ȓ: W +u*`[\^lmzQőIIb)=ة|42Բkyeʼnؕ ®\}t[WUcޛ>"rաFV0];yAɗ1VAsp%q ~ff$ MQeq=ţXzIc<;PK!cXnxl/workbook.xmlRn0W?X˗ SS;Rبɀ)NVC<D3v0t6K?,2cGIRȠJ}U_PK!S!xl/chartsheets/sheet1.xmlMO0 Hwƾn4i$$uhM\9$rz;Oo;rt e9( %U.4673P1P֫ei hDֱؔM̨ ؛$!7:vVD{ AuJ|cH5IuV'giEKn\Zjl ]c/:QΦ|t?χ3b yv&J@Ze+Nzm547PK!,xl/worksheets/sheet2.xmlQMK0 0wKE\="~ fJ27mqD0y/o^Gk;`0IRJkrxy^,AVRYv$ETp!ܭ V:tɷc:.V^\8V?Tצ "M*ސXp3YdWѾҞ*qG/v*-7SqŴ*4tvڷQ`|P1.uC bNfx vLb .M@D6N_T|PK!֎ihxl/charts/chart1.xmlUQo0~Y؊*JjRM+ǎlC˪N}}}ﻋsyU2٣B ,Au.:c?gYbV-w'|=1!e'HTj5]ެ7{+C:*4 ;%NX0[$dO>U'Z=qMWG܄iʩ!ke TV`^DݭeE9ѧhq==.>aU%=DAF>YU3JG@k!XpIdz(pj9=&1 _-tq5u[!lӿg]{FTm\Sԑ#qDFΈ6<okR6-5O CsEx>IoJֱiv~?PK!܌xxl/drawings/drawing1.xmlSMo0 OrhhѤ 4i8l?KSI*'@s&8L\Ďsڔkgc>9SVL]??O6Y|- ѧzAט!T",?rt]! ڔt<^DB/ i=܀f@[w>+ ]r1'uQU&)83$e4i:!Tk.}#{؜%}+~"Y̧Yy`a]ւ8ogm"kQJ]>JI \_1p'I֭&-PO=` ٤hOf_{GT{lU h׬ScR޻pnTIԄ48uOPK!h Kf xl/styles.xmlSj0 macIv N[R}$Mӳd/GgAh<|Xr@t{Kq{EFFsGl^;@'N"mC#bT1%9+p/FV\LDvEVyC'#1UZSjGz HJNK$cl` QdD6a-(3ٯ b(Xdy*2k$4o[zD(# u*m6M軾> :qrNNM8AGq/F˲c}OLYwη{ "EגCHUMX,uJײs~Z=QqY9)~PK!&y Xxl/theme/theme1.xmlYMoE#F{oc'Gu&%ݢԳ;qRP{DBBTj%.H 3މ$i#P3׌x1tD[[Tkb=,JHvFǀG^hciUC\v@G<`5C@yaE˫}} oZo>txnx`3kkݜ0z^5gAU+KfYmg4 uvR\|ƒv]oXd֖FmgחNpd%|ZQs2Oڡ~J=L8-o|(<4 `}.H'd}Fbo\xc|! ~!+^=''<ѣ?XZ]ō/>B?r B_<ٓ_~۷K;!D1:f JNFb;!=:spmﮀQ9:Lηs\UpŬ;wǎk{f;!q<`8V8 1QHSBJGc} .D{1-5ɐ@Zlڥe^3ڱ]L.9r?$1M ˍm}[w|]筶 Wv06crzJPjȞ4n1âhN$?6%!|M 6{CA&Ȕt Q%r)mA]ٳa]lAX] 'czN` M6DAaVB[Ոfj-W,ք1Vn9] fdn;pt >z/jŊ)>a&" vKY/T:,F-Y_{I˛F x].|%l؟&lfIP k%:X64̫4X9Y`RFkH Ivt]K&⫢ +v1-|c4b3q:TA1p=a*~4mm-i ήc8-:ELpǹ V*Q⪘$Ua?SE/kp+0P!* Lh Yx A G9Kä5! ЏT(9d bմwY,%d" L#rDP !M5Iˀ?9͠Qb95$6&3(a3dE,vٞޢ"b̪eY kpVk+֒L8ưD >#&uCC~m l iG08EL5m::ie'ݜ)ck ;\vN.^S ;k+M =4N21槭oO|t݅;S$0ٺ'PK!죐xl/worksheets/sheet1.xmlRKo0#,Y'c*InU $x=¿gQB§g{ъ|0*o2)5W )ij* ߿+@\@4 I~[߫0ymz4ZUdٹqra3 `<ă` 5| ]%u!U]&,HBCrR`ħx3C3t!2 {4xd*_nS_8{%:l1z:ѤQpCl0L: vD*iR,ܼ/hŠIVho9$s} iɻt_ BV I3ЋimO?.\Á? pls"EH PK!DmdocProps/core.xml (IO0HYQ+I%@=QD+e"%Yʁ=><9D|J hZ(JNk%@Gh^^^L < lI sN-ہ6ō2:4[)[i`r(nh@r6"3 5$JׁρN8EwNٜ>j46M5YOVTf:ew7ڂ Ov5n7|8W9)jJoY^Ҙ\$M?۰b8#Y2!e>H PK!l xdocProps/app.xml (S0#[ePxjA{QٽOIkؑ=|ԛ6"@43oi,:A;[$gZ*m{,?|`Y g` N}#V޵Ic" s΃aaa(~]]kKgyVXݴ'B/iT/<6 t \s"h_.{F1(5gsSV`p5 7s):w,[m `/`x ܾ-%ش6"ǮqocC ؘ&Ni&kO+$Ac0I 8˿7/x/fRpM ;E-p؆ˢXchdjy >&y<ǕjPK-!싫[Content_Types].xmlPK-!U0#L _rels/.relsPK-!A^xl/_rels/workbook.xml.relsPK-!cXnxl/workbook.xmlPK-!,g xl/worksheets/sheet3.xmlPK-!D߼%# xl/drawings/_rels/drawing1.xml.relsPK-!<+$ xl/chartsheets/_rels/sheet1.xml.relsPK-!S! xl/chartsheets/sheet1.xmlPK-!,xl/worksheets/sheet2.xmlPK-!֎ihxl/charts/chart1.xmlPK-!܌xxl/drawings/drawing1.xmlPK-!h Kf xl/styles.xmlPK-!&y Xxl/theme/theme1.xmlPK-!죐Txl/worksheets/sheet1.xmlPK-!DmdocProps/core.xmlPK-!l x!docProps/app.xmlPK<$