How to get Perl Spreadsheet :: WriteExcel to create formulas using VLOOKUP?

I'm having difficulty with Spreadsheet :: WriteExcel and formulas using VLOOKUP . The following test script fills the 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 cell containing the formulas (press F2 and then just ENTER without changing anything), I can get Excel to evaluate the formula correctly. Any idea what goes wrong?

What is it 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 Information:

  • Excel 2007 SP2.
  • Table: WriteExcel: tried both 2.25 and 2.37.
+4
source share
2 answers

I am the author of Spreadsheet :: WriteExcel.

This is a known bug with the formula parser and some types of formulas in WriteExcel. You can get around it with 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) ); } 
+7
source

I support writeexcel rubygem. e.g. ruby ​​code below.

 require 'rubygems' require 'writeexcel' wb = WriteExcel.new('fooruby.xls') ws = wb.add_worksheet formula = ws.store_formula('=VLOOKUP(K1, A1:B10, 2, FALSE)') # Workaround for VLOOKUP bug in WriteExcel. formula.map! {|f| f.sub(/_ref2d/, '_ref2dV') } (0..9).each do |row| (0..4).each { |col| ws.write(row, col, row * 10 + col) } ws.write(row, 10, row * 10) ws.repeat_formula(row, 11, formula, nil, /^K1$/, "K#{row+1}" ) end wb.close 
+4
source

Source: https://habr.com/ru/post/1300753/


All Articles