3

我正在尝试自动化一些测试用例。我正在使用 Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel 模块。

我无法将特定的单元格值读取为字符串,但当我在 Windows 中打开相同的 .xls 文件时,我可以将值视为字符串(PASS/FAIL)。

我正在使用 write_formula() 方法来编写字符串。我创建了一个示例项目来模拟相同的。我已经尽可能简单了。

关于下面的代码试图做什么的一点解释:

将以下内容连续写入 => 10 10 PASS 10 10 PASS

while 循环控制我们写 10 10 PASS 的次数

第一个 10 是实际值,第二个 10 是预期值,然后使用公式通过或失败。

您能否建议为什么我不能在下面的代码中使用 value() 方法将 PASS 或 FAIL 作为字符串读取?

use strict;
use warnings;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Spreadsheet::WriteExcel::Utility;

my $filename = "sample.xls";

my $workbook = Spreadsheet::WriteExcel->new($filename);

my $worksheet = $workbook->add_worksheet();

my $col = 0;
my $row = 0;
my $next_test_offset = 0;
my $new_value_offset = 1;
my $result_offset = 2;

while($col < 2) {
    $worksheet->write($row, $col+$next_test_offset, 10);
    $worksheet->write($row, $col+$next_test_offset+$new_value_offset, 10);

    my $old_test_cell = xl_rowcol_to_cell($row, $col+$next_test_offset);
    my $new_test_cell = xl_rowcol_to_cell($row, $col+$next_test_offset+$new_value_offset);

    $worksheet->write_formula($row, $col+$next_test_offset+$result_offset, sprintf("=IF(%s<>%s, \"FAIL\", \"PASS\")", $old_test_cell, $new_test_cell));

    $next_test_offset +=2;
    $col++;
}

$workbook->close();

my $parser = Spreadsheet::ParseExcel->new();
my $parser_workbook = $parser->parse($filename);

if(!defined $parser_workbook)
{
    die $parser->error(), ".\n";
}

for my $parser_worksheet ($parser_workbook->worksheets())
{
    my ($row_min, $row_max) = $parser_worksheet->row_range();
    my ($col_min, $col_max) = $parser_worksheet->col_range();

    for my $row ($row_min .. $row_max)
    {
        for my $col ($col_min .. $col_max)
        {
            my $cell = $parser_worksheet->get_cell($row, $col);
            next unless $cell;

            print "Row: ", $row, " Col: ", $col, " Value: ", $cell->value(), "\n";
        }
    }
}

输出:

Row: 0 Col: 0 Value: 10
Row: 0 Col: 1 Value: 10
Row: 0 Col: 2 Value: 0
Row: 0 Col: 3 Value: 10
Row: 0 Col: 4 Value: 10
Row: 0 Col: 5 Value: 0

行:0 Col:2 和行:0 Col:5 的预期 PASS

4

1 回答 1

3

这是一个记录在案的问题(参见http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel.pm#KNOWN_PROBLEMS):

此模块无法从使用 Spreadsheet::WriteExcel 创建的文件中读取公式的值,除非用户在创建文件时指定了值(通常不是这种情况)。

作为一种解决方法,您可以用等效的 perl 条件替换公式(例如$old_test_cell == $new_test_cell ? "PASS" : "FAIL"),只需将计算值写为简单值,而不是公式。

于 2013-09-24T12:30:58.490 回答