我正在为一个excel编写VLOOKUP公式。我尝试使用write_formula直接编写公式。我曾经得到#VALUE!当我点击ctrl + shift +在excel中输入时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模块,可以解决这个问题?
答案 0 :(得分:0)
这里有几个问题:
DB Sheet
包含一个空格,因此Excel要求在公式中使用时将其括在单引号中,如下所示:"=VLOOKUP(B16,'DB Sheet'!A2:D5,1,FALSE)"
。store_formula()
。这是低效且不正确的。 store_formula()
的要点是昂贵的公式解析只进行一次,然后可以通过repeat_formula()
重用预先解析的公式。它是explained at some length in the documentation并显示为in numerous examples。您应该仔细返回文档,然后尝试正确应用该方法,或者如果不是您需要的话,请避免使用它。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兼容,并且具有更快且无错误的公式支持。