1

我正在将 VLOOKUP 公式写入 excel。我尝试使用 write_formula 直接编写公式。我曾经得到#VALUE!当我在excel中按ctrl + shift + enter时出现excel错误,它工作正常。还尝试使用 store_formula 和重复公式相同的错误。

看起来公式被视为字符串。有没有办法克服这个问题?请帮忙!

my $i = 0;
foreach (@col){
my $op_mode_lookup = $worksheet1->store_formula("=VLOOKUP(B16,DB Sheet!A2:D5,".(${i}+1).",FALSE)");
.
.
.
$worksheet1->repeat_formula('B'.$row_count, $op_mode_lookup, undef);
$i++;
}

我尝试替换 "store_formula("=VLOOKUP(B16,DB Sheet!A2:D5,".(${i}+1).",FALSE)");" 下面仍然是同样的错误。

store_formula('=VLOOKUP(B16,DB Sheet!A2:D5,'.(${i}+1).',FALSE)'); store_formula('=VLOOKUP(B16,DB Sheet!A2:D5,2,FALSE)');

是否有用于 Spreadsheet::WriteExcel 的替代 perl 模块来克服这个问题?

4

1 回答 1

0

这里有几个问题:

  1. 工作表名称DB Sheet包含一个空格,因此 Excel 要求在公式中使用时将其括在单引号中,如下所示:"=VLOOKUP(B16,'DB Sheet'!A2:D5,1,FALSE)".
  2. store_formula()在循环中重复使用。这是低效且不正确的。关键store_formula()是昂贵的公式解析只进行一次,然后可以通过 重用预解析的公式repeat_formula()文档中有一些详细的解释,并在许多示例中显示。您应该仔细查看文档,然后尝试正确应用该方法或避免使用它,如果它不是您需要的东西。
  3. 从 Spreadsheet::WriteExcel 中使用时,有一个已知的(但不容易修复的)错误会影响VLOOKUP公式。下面的代码中显示了一种解决方法。

所以,解决这些问题会得到这样的结果:

#!/usr/bin/perl -w

use strict;
use Spreadsheet::WriteExcel;

my $workbook  = Spreadsheet::WriteExcel->new( 'demo.xls' );
my $worksheet1 = $workbook->add_worksheet();
my $worksheet2 = $workbook->add_worksheet('DB Sheet');

$worksheet1->write( 'B16', 1 );

for my $row ( 0 .. 7 ) {
    $worksheet2->write( $row, 0, $row );
}

my $op_mode_lookup = $worksheet1->store_formula(
                     "=VLOOKUP(B16,'DB Sheet'!A2:D5,1,FALSE)");

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

my @col = (0, 1, 2, 3);
my $row_count = 1;

foreach ( @col ){
    $worksheet1->repeat_formula('B' . $row_count, $op_mode_lookup, undef);
    $row_count++;
}

__END__

但是,我建议避免使用所有这些store_formula()代码和解决方法,而只使用Excel::Writer::XLSX

它与 Spreadsheet::WriteExcel 的 API 兼容,并且具有更快且无错误的公式支持。

于 2013-10-23T09:28:23.937 回答