Enforce XML::LibXML version requirements
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Parser / Excel.pm
index b041d38..0d98f6b 100644 (file)
@@ -1,12 +1,7 @@
 package SQL::Translator::Parser::Excel;
 
 # -------------------------------------------------------------------
-# $Id: Excel.pm,v 1.8 2003-10-09 16:38:25 kycl4rk Exp $
-# -------------------------------------------------------------------
-# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>,
-#                    darren chamberlain <darren@cpan.org>,
-#                    Chris Mungall <cjm@fruitfly.org>,
-#                    Mike Mellilo <mmelillo@users.sourceforge.net>
+# Copyright (C) 2002-2009 SQLFairy Authors
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License as
@@ -30,15 +25,13 @@ SQL::Translator::Parser::Excel - parser for Excel
 =head1 SYNOPSIS
 
   use SQL::Translator;
-  use SQL::Translator::Parser::Excel;
 
   my $translator = SQL::Translator->new;
-  $translator->parser("SQL::Translator::Parser::Excel");
+  $translator->parser('Excel');
 
 =head1 DESCRIPTION
 
-Parses an Excel spreadsheet file for SQL::Translator.  You can then
-turn the data into a database tables or graphs.
+Parses an Excel spreadsheet file using Spreadsheet::ParseExcel.
 
 =head1 OPTIONS
 
@@ -56,7 +49,7 @@ and field sizes.  True by default.
 use strict;
 use vars qw($DEBUG $VERSION @EXPORT_OK);
 $DEBUG = 0 unless defined $DEBUG;
-$VERSION = sprintf "%d.%02d", q$Revision: 1.8 $ =~ /(\d+)\.(\d+)/;
+$VERSION = '1.59';
 
 use Spreadsheet::ParseExcel;
 use Exporter;
@@ -140,7 +133,7 @@ sub parse {
                 ) {
                     my $field = $field_names[ $iC ];
                     my $data  = $ws->{'Cells'}[ $iR ][ $iC ]->{'_Value'};
-                       $data  = '' unless defined $data;
+                    next if !defined $data || $data eq '';
                     my $size  = [ length $data ];
                     my $type;
 
@@ -155,8 +148,11 @@ sub parse {
                         $data =~ /^-?\.\d+$/  
                     ) {
                         $type = 'float';
-                        my ( $w, $d ) = map { s/,//g; $_ } split( /\./, $data );
-                        $size = [ length $w, length $d ];
+                        my ( $w, $d ) = 
+                            map { s/,//g; length $_ || 1 } 
+                            split( /\./, $data )
+                        ;
+                        $size = [ $w + $d, $d ];
                     }
                     else {
                         $type = 'char';
@@ -175,13 +171,18 @@ sub parse {
             }
 
             for my $field ( keys %field_info ) {
-                my $size      = $field_info{ $field }{'size'};
+                my $size      = $field_info{ $field }{'size'} || [ 1 ];
                 my $data_type = 
-                    $field_info{ $field }{'char'}  ? 'char'  : 
-                    $field_info{ $field }{'float'} ? 'float' : 'integer';
+                    $field_info{ $field }{'char'}    ? 'char'    : 
+                    $field_info{ $field }{'float'}   ? 'float'   :
+                    $field_info{ $field }{'integer'} ? 'integer' : 'char';
+
+                if ( $data_type eq 'char' && scalar @$size == 2 ) {
+                    $size = [ $size->[0] + $size->[1] ];
+                }
 
                 my $field = $table->get_field( $field );
-                $field->size( $size );
+                $field->size( $size ) if $size;
                 $field->data_type( $data_type );
             }
         }