tags:

views:

63

answers:

1

I'm having difficulty with Spreadsheet::WriteExcel and formulas that use VLOOKUP. The following test script populates a worksheet with some data and tries to create a VLOOKUP formula. When I open the resulting Excel file, the formula results are displayed as #VALUE!. If I manually edit any of the cells containing formulas (press F2 and then just ENTER without changing anything), I can get Excel to evaluate the formula properly. Any idea what going wrong?

For what it's worth, if I open the same file in OpenOffice, the formulas work fine.

use strict;
use warnings;
use Spreadsheet::WriteExcel;

my $wb = Spreadsheet::WriteExcel->new('foo.xls');
my $ws = $wb->add_worksheet;

for my $r (0 .. 9){
    for my $c (0 .. 4){
        $ws->write($r, $c, $r * 10 + $c);
    }
    $ws->write($r, 10, $r * 10);
    my $formula = sprintf('=VLOOKUP(K%s, A1:B10, 2, FALSE)', $r + 1);
    $ws->write( $r, 11, $formula );
    # $ws->write_formula( $r, 11, $formula ); # Does not help either.
}

Version info:

  • Excel 2007 SP2.
  • Spreadsheet::WriteExcel: tried both 2.25 and 2.37.
+5  A: 

I am the author of Spreadsheet::WriteExcel.

This is a known error with the formula parser and certain formula types in WriteExcel. You can work around it using store_formula() and repeat_formula() as shown below:

use strict;
use warnings;
use Spreadsheet::WriteExcel;

my $wb = Spreadsheet::WriteExcel->new('foo.xls');
my $ws = $wb->add_worksheet;

my $formula = $ws->store_formula('=VLOOKUP(K1, A1:B10, 2, FALSE)');

# Workaround for VLOOKUP bug in WriteExcel.
@$formula = map {s/_ref2d/_ref2dV/;$_} @$formula;

for my $r (0 .. 9){
    for my $c (0 .. 4){
        $ws->write($r, $c, $r * 10 + $c);
    }
    $ws->write($r, 10, $r * 10);

    $ws->repeat_formula( $r, 11, $formula, undef, qr/^K1$/, 'K' . ($r +1) );
}
jmcnamara
Thanks a lot. I appreciate the help.
FM
interesting that the OP reports it working in OpenOffice
ysth