如何让Perl的Spreadsheet :: WriteExcel使用VLOOKUP创build公式?

我遇到了Spreadsheet :: WriteExcel和使用VLOOKUP公式的困难。 以下testing脚本使用一些数据填充工作表,并尝试创buildVLOOKUP公式。 当我打开生成的Excel文件时,公式结果显示为#VALUE! 。 如果我手动编辑任何包含公式的单元格(按F2然后只是input而不改变任何东西),我可以让Excel正确地评估公式。 任何想法出了什么问题?

对于它的价值,如果我在OpenOffice中打开相同的文件,公式工作正常。

 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. } 

版本信息:

  • Excel 2007 SP2。
  • Spreadsheet :: WriteExcel:尝试2.25和2.37。

我是Spreadsheet :: WriteExcel的作者。

这是公式parsing器和WriteExcel中某些公式types的已知错误。 你可以使用store_formula()repeat_formula()来解决它,如下所示:

 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) ); } 

我是writeexcel ruby​​gem的维护者。 例如,ruby代码在下面。

 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