在编写公式时,Spreadsheet :: WriteExcel被视为字符串

时间:2013-10-22 05:50:46

标签: excel perl

我正在为一个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模块,可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

这里有几个问题:

  1. 工作表名称DB Sheet包含一个空格,因此Excel要求在公式中使用时将其括在单引号中,如下所示:"=VLOOKUP(B16,'DB Sheet'!A2:D5,1,FALSE)"
  2. 您在循环中重复使用store_formula()。这是低效且不正确的。 store_formula()的要点是昂贵的公式解析只进行一次,然后可以通过repeat_formula()重用预先解析的公式。它是explained at some length in the documentation并显示为in numerous examples。您应该仔细返回文档,然后尝试正确应用该方法,或者如果不是您需要的话,请避免使用它。
  3. 从Spreadsheet :: WriteExcel中使用时,有一个已知(但不易修复)的错误可能会影响VLOOKUP公式。解决方法显示在下面的代码中。
  4. 因此,解决这些问题会产生类似的结果:

    #!/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兼容,并且具有更快且无错误的公式支持。