[libspreadsheet-readsxc-perl] 03/12: Imported Upstream version 0.20

Andrius Merkys andrius.merkys at gmail.com
Wed Dec 20 16:44:43 UTC 2017


This is an automated email from the git hooks/post-receive script.

merkys-guest pushed a commit to branch master
in repository libspreadsheet-readsxc-perl.

commit 1796bf23909d99501b408ac7226bb7797f2d92e4
Author: Andrius Merkys <andrius.merkys at gmail.com>
Date:   Fri Dec 8 11:16:06 2017 +0200

    Imported Upstream version 0.20
---
 Changes      |  35 ++++
 MANIFEST     |   8 +
 META.yml     |  12 ++
 Makefile.PL  |  16 ++
 README       |  67 ++++++++
 ReadSXC.pm   | 519 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 debian/watch |   2 -
 t.sxc        | Bin 0 -> 6045 bytes
 t/1.t        |  42 +++++
 9 files changed, 699 insertions(+), 2 deletions(-)

diff --git a/Changes b/Changes
new file mode 100644
index 0000000..cafc674
--- /dev/null
+++ b/Changes
@@ -0,0 +1,35 @@
+Revision history for Perl extension Spreadsheet::ReadSXC.
+
+0.20  Fri Jun 17 2005
+	- almost completely rewritten to use XML::Parser's event style (instead of its tree
+	  style), resulting in more readable and (hopefully) maintainable code
+	- this version allows for multiple open files by returning an anonymous data structure
+	  instead of a data reference (thanks to H. Merijn Brand for fixing this)
+	- new option to return an array of hashes instead of a hash of arrays
+	- new option to return time cells as time value
+
+0.12  Sun May 8 2005
+	- comments no longer appear in cells (have to find a cleaner way of returning annotations)
+
+0.11  Sun May 8 2005
+	- eliminated a bug with 'DropHiddenColumns' which would populate an empty table
+	- edited documentation
+
+0.10  Fri May 6 2005
+	- almost completely rewritten to use XML::Parser instead of XML::Parser::Lite::Tree
+	- new options to include/drop hidden rows/col, covered cells etc.
+	- optionally truncate empty rows and columns
+	- optionally replace newlines in cells with any string
+	- new subroutines for reading unpacked XML data from SXC files
+	- option to return date cells as standard date value
+
+0.03  Tue May 3 2005
+	- more prerequisites in Makefile.PL
+	- minor corrections in documentation
+
+0.02  Mon May 1 2005
+	- fixed prerequisites in Makefile.PL
+
+0.01  Sat Apr 30 2005
+	- original version; created by h2xs 1.22 with options
+		-XAn Spreadsheet::ReadSXC
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..e6bd348
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,8 @@
+Changes
+Makefile.PL
+MANIFEST
+ReadSXC.pm
+README
+t.sxc
+t/1.t
+META.yml                                Module meta-data (added by MakeMaker)
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..000994b
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,12 @@
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         Spreadsheet-ReadSXC
+version:      0.20
+version_from: ReadSXC.pm
+installdirs:  site
+requires:
+    Archive::Zip:                  0
+    Test::More:                    0
+    XML::Parser:                   0
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.12
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..6ad5f02
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,16 @@
+use 5.006;
+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::ReadSXC',
+    VERSION_FROM      => 'ReadSXC.pm', # finds $VERSION
+    PREREQ_PM         => {
+				'XML::Parser'	=> 0,
+				'Archive::Zip'	=> 0,
+				'Test::More'	=> 0,
+			}, # e.g., Module::Name => 1.1
+    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
+      (ABSTRACT_FROM  => 'ReadSXC.pm', # retrieve abstract from module
+       AUTHOR         => 'Christoph Terhechte <terhechte at cpan.org>') : ()),
+);
diff --git a/README b/README
new file mode 100644
index 0000000..263272c
--- /dev/null
+++ b/README
@@ -0,0 +1,67 @@
+Spreadsheet/ReadSXC version 0.20
+=================================
+
+Extract OpenOffice 1.x spreadsheet data.
+
+Spreadsheet::ReadSXC extracts data from OpenOffice 1.x
+spreadsheet files (.sxc). It exports the function read_sxc()
+which takes a filename and an optional reference to a hash of
+options as arguments and returns a hash of references to
+two-dimensional arrays. The hash keys correspond to the names of
+worksheets in the OpenOffice workbook. The two-dimensional arrays
+correspond to rows and cells in the respective spreadsheets.
+
+Spreadsheet::ReadSXC requires XML::Parser to parse the XML
+contained in .sxc files. Only the contents of 'text:p' elements are
+returned, not the actual values of 'table:value' attributes.
+
+Empty spreadsheet cells correspond to undef values in array rows.
+If the .sxc file contains an empty spreadsheet its hash element will
+point to an empty array.
+
+Spreadsheet::ReadSXC truncates spreadsheets so that there are no
+empty rows after the last row containing data and no empty columns
+after the last column containing data (unless the 'NoTruncate'
+option is used).
+
+The behaviour of this module is controlled through several options,
+namely 'ReplaceNewlineWith', 'IncludeCoveredCells', 'DropHiddenRows',
+'DropHiddenColumns', 'NoTruncate', 'StandardDate', and
+'StandardTime'.
+
+I'll add more options in the future so that you can choose between
+'text:p' contents and 'table:value' values the same way the
+'StandardDate' option lets you use a 'table:date-value' instead of
+its 'text:p' equivalent.
+
+I've added the read_xml_file() and read_xml_string() functions in
+version 0.10. These approaches could be unified so that read_sxc()
+would handle .sxc files, content.xml files, and xml strings
+alternatively. H. Merijn Brand's Spreadsheet::ReadData does just
+that. It also treats Excel files (using Spreadsheet::ParseExcel)
+and CSV 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:
+
+   XML::Parser
+   Archive::Zip
+   Test::More
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2005 Christoph Terhechte
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself. 
+
diff --git a/ReadSXC.pm b/ReadSXC.pm
new file mode 100644
index 0000000..bac8879
--- /dev/null
+++ b/ReadSXC.pm
@@ -0,0 +1,519 @@
+package Spreadsheet::ReadSXC;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(read_sxc read_xml_file read_xml_string);
+our $VERSION = '0.20';
+
+use Archive::Zip;
+use XML::Parser;
+
+my %workbook = ();
+my @worksheets = ();
+my @sheet_order = ();
+my $table = "";
+my $row = -1;
+my $col = -1;
+my $text_p = -1;
+my @cell = ();
+my $repeat_cells = 1;
+my $repeat_rows = 1;
+my $row_hidden = 0;
+my $date_value = '';
+my $time_value = '';
+my $max_datarow = -1;
+my $max_datacol = -1;
+my $col_count = -1;
+my @hidden_cols = ();
+my %options = ();
+
+sub zip_error_handler {}
+
+sub read_sxc ($;$) {
+	my ($sxc_file, $options_ref) = @_;
+	-f $sxc_file && -s _ or return undef;
+	Archive::Zip::setErrorHandler(\&zip_error_handler);
+	eval {
+		my $zip = Archive::Zip->new($sxc_file);
+		my $xml_string = $zip->contents('content.xml');
+		return read_xml_string($xml_string, $options_ref);
+	};
+}
+
+sub read_xml_file ($;$) {
+	my ($xml_file, $options_ref) = @_;
+	-f $xml_file && -s _ or return undef;
+	local $/;
+	open CONTENT, "<$xml_file" or die "$xml_file: $!\n";
+	my $xml_string = <CONTENT>;
+	close CONTENT;
+	return read_xml_string($xml_string, $options_ref);
+}
+
+sub read_xml_string ($;$) {
+	my ($xml_string, $options_ref) = @_;
+	%workbook = ();
+	@worksheets = ();
+	if ( defined $options_ref ) { %options = %{$options_ref}}
+	eval {
+		my $p = XML::Parser->new(Handlers => {Start => \&handle_start,
+						      End => \&handle_end,
+						      Char => \&char_start});
+		$p->parse($xml_string);
+	};
+	if ( $options{OrderBySheet} ) { return [@worksheets] } else { return {%workbook} }
+}
+
+sub handle_start {
+	my ($expat, $element, %attributes) = @_;
+	if ( $element eq "text:p" ) {
+# increase paragraph count if not part of an annotation
+		if ( ! $expat->within_element('office:annotation') ) { $text_p++ }
+	}
+	elsif ( ( $element eq "table:table-cell" ) or ( $element eq "table:covered-table-cell" ) ) {
+# increase cell count
+		$col++;
+# if number-columns-repeated is set, set $repeat_cells value accordingly for later use
+		if ( exists $attributes{'table:number-columns-repeated'} ) {
+			$repeat_cells = $attributes{'table:number-columns-repeated'};
+		}
+# if cell contains date or time values, set boolean variable for later use
+		if (exists $attributes{'table:date-value'} ) {
+			$date_value = $attributes{'table:date-value'};
+		}
+		elsif (exists $attributes{'table:time-value'} ) {
+			$time_value = $attributes{'table:time-value'};
+		}
+	}
+	elsif ( $element eq "table:table-row" ) {
+# increase row count
+		$row++;
+# if row is hidden, set $row_hidden for later use
+		if ( exists $attributes{'table:visibility'} ) { $row_hidden = 1 } else { $row_hidden = 0 }
+# if number-rows-repeated is set, set $repeat_rows value accordingly for later use
+		if ( exists $attributes{'table:number-rows-repeated'} ) {
+			$repeat_rows = $attributes{'table:number-rows-repeated'};
+		}
+	}
+	elsif ( $element eq "table:table-column" ) {
+# increase column count
+		$col_count++;
+# if columns is hidden, add column number to @hidden_cols array for later use
+		if ( exists $attributes{'table:visibility'} ) {
+			push @hidden_cols, $col_count;
+		}
+# if number-columns-repeated is set and column is hidden, add affected columns to @hidden_cols
+		if ( exists $attributes{'table:number-columns-repeated'} ) {
+			$col_count++;
+			if ( exists $attributes{'table:visibility'} ) {
+				for (2..$attributes{'table:number-columns-repeated'}) {
+					push @hidden_cols, $hidden_cols[$#hidden_cols] + 1;
+				}
+			}
+		}
+	}
+	elsif ( $element eq "table:table" ) {
+# get name of current table
+		$table = $attributes{'table:name'};
+	}
+}
+
+sub handle_end {
+	my ($expat, $element) = @_;
+	if ( $element eq "table:table") {
+# decrease $max_datacol if hidden columns within range
+		if ( ( ! $options{NoTruncate} ) and ( $options{DropHiddenColumns} ) ) {
+			for ( 1..scalar grep { $_ <= $max_datacol } @hidden_cols ) {
+				$max_datacol--;
+			}
+		}
+# truncate table to $max_datarow and $max_datacol
+		if ( ! $options{NoTruncate} ) {
+			$#{$workbook{$table}} = $max_datarow;
+			foreach ( @{$workbook{$table}} ) {
+				$#{$_} = $max_datacol;
+			}
+		}
+# set up alternative data structure
+		if ( $options{OrderBySheet} ) {
+			push @worksheets, (
+				{
+					label	=> $table,
+					data	=> \@{$workbook{$table}},
+				}
+			);
+		}
+# reset table, column, and row values to default for next table
+		$row = -1;
+		$max_datarow = -1;
+		$max_datacol = -1;
+		$table = "";
+		$col_count = -1;
+		@hidden_cols = ();
+	}
+	elsif ( $element eq "table:table-row" ) {
+# drop hidden columns from current row
+		if ( $options{DropHiddenColumns} ) {
+			foreach ( reverse @hidden_cols ) {
+				splice @{$workbook{$table}[$row]}, $_, 1;
+			}
+		}
+# drop current row, if hidden
+		if ( ( $options{DropHiddenRows} ) and ( $row_hidden == 1 ) ) {
+			pop @{$workbook{$table}};
+			$row--;
+		}
+# repeat current row, if necessary
+		else {
+			for (2..$repeat_rows) {
+				$row++;
+				$workbook{$table}[$row] = $workbook{$table}[$row - 1]	# copy reference, not data
+			}
+# set max_datarow, if row not empty
+			if ( grep { defined $_ } @{$workbook{$table}[$row]} ) {
+				$max_datarow = $row;
+			}
+		}
+# reset row and col values to default for next row
+		$repeat_rows = 1;
+		$col = -1;
+	}
+	elsif ( ( $element eq "table:table-cell" ) or ( $element eq "table:covered-table-cell" ) ) {
+# assign date or time value to current workbook cell if requested
+		if ( ( $options{StandardDate} ) and ( $date_value ) ) {
+			$workbook{$table}[$row][$col] = $date_value;
+			$date_value = '';
+		}
+		elsif ( ( $options{StandardTime} ) and ( $time_value ) ) {
+			$workbook{$table}[$row][$col] = $time_value;
+			$time_value = '';
+		}
+# join cell contents and assign to current workbook cell
+		else {
+			$workbook{$table}[$row][$col] = @cell ? join $options{ReplaceNewlineWith} || "", @cell : undef;
+		}
+# repeat current cell, if necessary
+		for (2..$repeat_cells) {
+			$col++;
+			$workbook{$table}[$row][$col] = $workbook{$table}[$row][$col - 1];
+		}
+# reset cell and paragraph values to default for next cell
+		@cell = ();
+		$repeat_cells = 1;
+		$text_p = -1;
+	}
+}
+
+sub char_start {
+	my ($expat, $content) = @_;
+# don't include paragraph if part of an annotation
+	if ( $expat->within_element('office:annotation') ) {
+		return;
+	}
+# don't include covered cells, if not requested
+	if ( ( $expat->within_element('table:covered-table-cell') ) and ( ! $options{IncludeCoveredCells} ) ) {
+		return;
+	}
+# add paragraph or textspan to current @cell array
+	if ( $table ) {
+		$cell[$text_p] .= $content;
+# set $max_datarow and $max_datacol to current values
+		$max_datarow = $row;
+		if ( $col > $max_datacol ) { $max_datacol = $col }
+	}
+}
+
+1;
+__END__
+=head1 NAME
+
+Spreadsheet::ReadSXC - Extract OpenOffice 1.x spreadsheet data
+
+
+=head1 SYNOPSIS
+
+
+  use Spreadsheet::ReadSXC qw(read_sxc);
+  my $workbook_ref = read_sxc("/path/to/file.sxc");
+
+
+  # Alternatively, unpack the .sxc file yourself and pass content.xml
+
+  use Spreadsheet::ReadSXC qw(read_xml_file);
+  my $workbook_ref = read_xml_file("/path/to/content.xml");
+
+
+  # Alternatively, pass the XML string directly
+
+  use Spreadsheet::ReadSXC qw(read_xml_string);
+  use Archive::Zip;
+  my $zip = Archive::Zip->new("/path/to/file.sxc");
+  my $content = $zip->contents('content.xml');
+  my $workbook_ref = read_xml_string($content);
+
+
+  # Control the output through a hash of options (below are the defaults):
+
+  my %options = (
+	ReplaceNewlineWith	=> "",
+	IncludeCoveredCells	=> 0,
+	DropHiddenRows		=> 0,
+	DropHiddenColumns	=> 0,
+	NoTruncate		=> 0,
+	StandardDate		=> 0,
+	StandardTime		=> 0,
+	OrderBySheet		=> 0,
+  );
+  my $workbook_ref = read_sxc("/path/to/file.sxc", \%options );
+
+
+  # Iterate over every worksheet, row, and cell:
+
+  use Unicode::String qw(utf8);
+
+  foreach ( sort keys %$workbook_ref ) {
+     print "Worksheet ", $_, " contains ", $#{$$workbook_ref{$_}} + 1, " row(s):\n";
+     foreach ( @{$$workbook_ref{$_}} ) {
+        foreach ( map { defined $_ ? $_ : '' } @{$_} ) {
+	   print utf8(" '$_'")->as_string;
+        }
+        print "\n";
+     }
+  }
+
+
+  # Cell D2 of worksheet "Sheet1"
+
+  $cell = $$workbook_ref{"Sheet1"}[1][3];
+
+
+  # Row 1 of worksheet "Sheet1":
+
+  @row = @{$$workbook_ref{"Sheet1"}[0]};
+
+
+  # Worksheet "Sheet1":
+
+  @sheet = @{$$workbook_ref{"Sheet1"}};
+
+
+
+=head1 DESCRIPTION
+
+
+Spreadsheet::ReadSXC extracts data from OpenOffice 1.x spreadsheet
+files (.sxc). It exports the function read_sxc() which takes a
+filename and an optional reference to a hash of options as
+arguments and returns a reference to a hash of references to
+two-dimensional arrays. The hash keys correspond to the names of
+worksheets in the OpenOffice workbook. The two-dimensional arrays
+correspond to rows and cells in the respective spreadsheets. If
+you don't like this because the order of sheets is not preserved
+in a hash, read on. The 'OrderBySheet' option provides an array
+of hashes instead.
+
+If you prefer to unpack the .sxc file yourself, you can use the
+function read_xml_file() instead and pass the path to content.xml
+as an argument. Or you can extract the XML string from content.xml
+and pass the string to the function read_xml_string(). Both
+functions also take a reference to a hash of options as an
+optional second argument.
+
+Spreadsheet::ReadSXC requires XML::Parser to parse the XML
+contained in .sxc files. Only the contents of text:p elements are
+returned, not the actual values of table:value attributes. For
+example, a cell might have a table:value-type attribute of
+"currency", a table:value attribute of "-1500.99" and a
+table:currency attribute of "USD". The text:p element would
+contain "-$1,500.99". This is the string which is returned by the
+read_sxc() function, not the value of -1500.99.
+
+Spreadsheet::ReadSXC was written with data import into an SQL
+database in mind. Therefore empty spreadsheet cells correspond to
+undef values in array rows. The example code above shows how to
+replace undef values with empty strings.
+
+If the .sxc file contains an empty spreadsheet its hash element will
+point to an empty array (unless you use the 'NoTruncate' option in
+which case it will point to an array of an array containing one
+undefined element).
+
+OpenOffice uses UTF-8 encoding. It depends on your environment how
+the data returned by the XML Parser is best handled:
+
+  use Unicode::String qw(latin1 utf8);
+  $unicode_string = utf8($$workbook_ref{"Sheet1"}[0][0])->as_string;
+
+  # this will not work for characters outside ISO-8859-1:
+
+  $latin1_string = utf8($$workbook_ref{"Sheet1"}[0][0])->latin1;
+
+Of course there are other modules than Unicode::String on CPAN that
+handle conversion between encodings. It's your choice.
+
+Table rows in .sxc files may have a "table:number-rows-repeated"
+attribute, which is often used for consecutive empty rows. When you
+format whole rows and/or columns in OpenOffice, it sets the numbers
+of rows in a worksheet to 32,000 and the number of columns to 256, even
+if only a few lower-numbered rows and cells actually contain data.
+Spreadsheet::ReadSXC truncates such sheets so that there are no empty
+rows after the last row containing data and no empty columns after the
+last column containing data (unless you use the 'NoTruncate' option).
+
+Still it is perfectly legal for an .sxc file to apply the
+"table:number-rows-repeated" attribute to rows that actually contain
+data (although I have only been able to produce such files manually,
+not through OpenOffice itself). To save on memory usage in these cases,
+Spreadsheet::ReadSXC does not copy rows by value, but by reference
+(remember that multi-dimensional arrays in Perl are really arrays of
+references to arrays). Therefore, if you change a value in one row, it
+is possible that you find the corresponding value in the next row
+changed, too:
+
+  $$workbook_ref{"Sheet1"}[0][0] = 'new string';
+  print $$workbook_ref{"Sheet1"}[1][0];
+
+As of version 0.20 the references returned by read_sxc() et al. remain
+valid after subsequent calls to the same function. In earlier versions,
+calling read_sxc() with a different file as the argument would change
+the data referenced by the original return value, so you had to
+derefence it before making another call. Thanks to H. Merijn Brand for
+fixing this.
+
+
+=head1 OPTIONS
+
+=over 4
+
+=item ReplaceNewlineWith
+
+By default, newlines within cells are ignored and all lines in a cell
+are concatenated to a single string which does not contain a newline. To
+keep the newline characters, use the following key/value pair in your
+hash of options: 
+
+  ReplaceNewlineWith => "\n"
+
+However, you may replace newlines with any string you like.
+
+
+=item IncludeCoveredCells
+
+By default, the content of cells that are covered by other cells is
+ignored because you wouldn't see it in OpenOffice unless you unmerge
+the merged cells. To include covered cells in the data structure which
+is returned by parse_sxc(), use the following key/value pair in your
+hash of options:
+
+  IncludeCoveredCells => 1
+
+
+=item DropHiddenRows
+
+By default, hidden rows are included in the data structure returned by
+parse_sxc(). To drop those rows, use the following key/value pair in
+your hash of options:
+
+  DropHiddenRows => 1
+
+
+=item DropHiddenColumns
+
+By default, hidden columns are included in the data structure returned
+by parse_sxc(). To drop those rows, use the following key/value pair
+in your hash of options:
+
+  DropHiddenColumns => 1
+
+
+=item NoTruncate
+
+By default, the two-dimensional arrays that contain the data within
+each worksheet are truncated to get rid of empty rows below the last
+row containing data and empty columns beyond the last column
+containing data. If you prefer to keep those rows and columns, use the
+following key/value pair in your hash of options:
+
+  NoTruncate => 1
+
+
+=item StandardDate
+
+By default, date cells are returned as formatted. If you prefer to
+obtain the date value as contained in the table:date-value attribute,
+use the following key/value pair in your hash of options:
+
+  StandardDate => 1
+
+
+=item StandardTime
+
+By default, time cells are returned as formatted. If you prefer to
+obtain the time value as contained in the table:time-value attribute,
+use the following key/value pair in your hash of options:
+
+  StandardTime => 1
+
+These options are a first step on the way to a different approach at
+reading data from .sxc files. There should be more options to read in
+values instead of the strings OpenOffice displays. It should give
+more flexibility in working with the data obtained from OpenOffice
+spreadsheets. 'float' and 'percentage' values could be next.
+'currency' is less obvious, though, as we need to consider both its
+value and the 'table:currency' attribute. Formulas and array formulas
+are yet another issue. I probably won't deal with this until I've
+given this module an object-oriented interface.
+
+
+=item OrderBySheet
+
+The disadvantage of storing worksheets by name in a hash is that the
+order of sheets is lost. If you prefer not to obtain such a hash, but
+an array of worksheets insted, use the following key/value pair in
+your hash of options:
+
+  OrderBySheet => 1
+
+Thus the read_sxc function will return an array of hashes, each of
+which will have two keys, "label" and "data". The value of "label"
+is the name of the sheet. The value of data is a reference to a
+two-dimensional array containing rows and columns of the worksheet:
+
+  my $worksheets_ref = read_sxc("/path/to/file.sxc");
+  my $name_of_first_sheet = $$worksheets_ref[0]{label};
+  my $first_cell_of_first_sheet = $$worksheets_ref[0]{data}[0][0];
+
+
+=back
+
+
+
+=head1 SEE ALSO
+
+
+http://books.evc-cit.info/oobook/book.html has extensive documentation
+of the OpenOffice 1.x XML file format (soon to be replaced by the
+OASIS file format, see http://books.evc-cit.info/odbook/book.html).
+
+
+
+=head1 AUTHOR
+
+
+Christoph Terhechte, E<lt>terhechte at cpan.orgE<gt>
+
+
+=head1 COPYRIGHT AND LICENSE
+
+
+Copyright 2005 by Christoph Terhechte
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself. 
+
+=cut
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index a2d9580..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-version=3
-https://metacpan.org/release/Spreadsheet-ReadSXC   .*/Spreadsheet-ReadSXC-v?(\d[\d.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)$
diff --git a/t.sxc b/t.sxc
new file mode 100644
index 0000000..c2ba259
Binary files /dev/null and b/t.sxc differ
diff --git a/t/1.t b/t/1.t
new file mode 100644
index 0000000..42de862
--- /dev/null
+++ b/t/1.t
@@ -0,0 +1,42 @@
+use Test::More tests => 8;
+BEGIN { use_ok('Spreadsheet::ReadSXC') };
+BEGIN { use_ok('Archive::Zip') };
+BEGIN { use_ok('XML::Parser') };
+
+my $zip = Archive::Zip->new();
+ok(( $zip->read("t.sxc") == 0 ), 'Unzipping .sxc file');
+
+my $workbook_ref = Spreadsheet::ReadSXC::read_sxc("t.sxc");
+
+my @sheets = sort keys %$workbook_ref;
+
+ok((($sheets[0] eq "Sheet1") and ($sheets[1] eq "Sheet2") and ($sheets[2] eq "Sheet3")), 'Comparing spreadsheet names');
+
+my @sheet1_data = (['-$1,500.99', '17', undef],[undef, undef, undef],['one', 'more', 'cell']);
+my @sheet3_data = (['Both alike', 'Both alike', undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, undef], [undef, undef, 'Cell C14']);
+
+my @sheet1 = @{$$workbook_ref{"Sheet1"}};
+ok((&array_cmp(\@sheet1, \@sheet1_data)), 'Verifying Sheet1');
+
+ok(( @{$$workbook_ref{"Sheet2"}} == 0 ), 'Verifying Sheet2');
+
+my @sheet3 = @{$$workbook_ref{"Sheet3"}};
+ok((&array_cmp(\@sheet3, \@sheet3_data)), 'Verifying Sheet3');
+
+sub array_cmp {
+	my $a1_ref = shift;
+	my $a2_ref = shift;
+	for my $i ( 0..$#{$a1_ref} ) {
+		for my $j ( 0..$#{$$a1_ref[$i]} ) {
+			if ( ! defined $$a1_ref[$i][$j] ) {
+				if ( defined $$a2_ref[$i][$j] ) {
+					return 0;
+				}
+			}
+			elsif ( $$a1_ref[$i][$j] ne $$a2_ref[$i][$j] ) {
+				return 0;
+			}
+		}
+	}
+	return 1;
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libspreadsheet-readsxc-perl.git



More information about the Pkg-perl-cvs-commits mailing list