
package Spreadsheet::ConvertAA;

use 5.006;
use strict;
use warnings;
use Carp ;

require Exporter;
use AutoLoader qw(AUTOLOAD);

our @ISA = qw(Exporter);
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw( FromAA ToAA);
our $VERSION = '0.05';


#----------------------------------------------------

sub ToAA($)
{
my $c = shift ;
confess "Invalid base10 '$c'" if($c =~ /[^0-9]/) ;

return('@') if $c == 0 ;

my $cell = "";

while($c)
	{
	use integer;
	substr ($cell, 0, 0) = chr (--$c % 26 + ord "A");
	$c /= 26;
	}

return($cell) ;
}

sub FromAA ($)
{
my $cc = shift ;
confess "Invalid baseAA '$cc'" if($cc =~ /[^A-Za-z@]/) ;

my $c = 0;

while($cc =~ s/^([A-Z])//) 
	{
	$c = 26 * $c + 1 + ord ($1) - ord ("A");
	}

return($c);
}

#----------------------------------------------------

1;
__END__
=head1 NAME

Spreadsheet::ConvertAA - Perl extension for Converting Spreadsheet column name to/from  decimal

=head1 SYNOPSIS

  use Spreadsheet::ConvertAA ;

  my $baseAA = ToAA(475255) ;
  my $base10 = FromAA('AAAZ') ;

=head1 DESCRIPTION

This module allows you to convert from Spreadsheet column notation ('A', 'AZ', 'BC') to decimal and back.

The Spreadsheet column notation is base 26 _without_ zero. 'A' is 1 and 'AA' is 27. I named the base 'AA' because
I found no better name.

Spreadsheet::ConvertAA 'confess' on invalid input.

=head1 IMPORTANT

As of version 0.04, I have replaced the implementation of ToAA and FromAA with code from L<Spreadsheet::Read> written
by B<H.Merijn Brand>. The new code is cleaner. The new ToAA is 50% faster and the new FromAA is only slightly slower.

The new code doesn't have the limitation ConvertAA had previously.

=head2 EXPORT

ToAA and FromAA

=head1 AUTHOR

Khemir Nadim ibn Hamouda. <nadim@khemir.net>

  Copyright (c) 2004-2005 Nadim Ibn Hamouda el Khemir. All rights
  reserved.  This program is free software; you can redis-
  tribute it and/or modify it under the same terms as Perl
  itself.
  
If you find any value in this module, mail me!  All hints, tips, flames and wishes
are welcome at <nadim@khemir.net>.

=head1 SEE ALSO

L<Spreadsheet::Perl>. L<Spreadsheet::Read>.

=cut

