Как получить Perl's Spreadsheet :: WriteExcel для создания формул с VLOOKUP? - PullRequest
4 голосов
/ 09 февраля 2010

У меня проблемы с Spreadsheet :: WriteExcel и формулами, которые используют VLOOKUP. Следующий тестовый скрипт заполняет рабочий лист некоторыми данными и пытается создать формулу VLOOKUP. Когда я открываю полученный файл Excel, результаты формулы отображаются как #VALUE!. Если я вручную отредактирую одну из ячеек, содержащих формулы (нажмите F2, а затем просто ВВОД, ничего не меняя), я смогу заставить 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.

Ответы [ 2 ]

7 голосов
/ 10 февраля 2010

Я являюсь автором Spreadsheet :: WriteExcel.

Это известная ошибка синтаксического анализатора формул и некоторых типов формул в WriteExcel. Вы можете обойти это, используя 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) );
}
4 голосов
/ 03 июня 2011

Я поддерживаю writeexcel rubygem. например, код рубина ниже.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...