【问题标题】:Reading cell value as string set via write_formula() using Excel Modules使用 Excel 模块将单元格值读取为通过 write_formula() 设置的字符串
【发布时间】:2013-09-29 13:18:19
【问题描述】:

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

虽然当我在 Windows 中打开同一个 .xls 文件时,我无法将特定单元格的值读取为字符串(通过/失败)。

我正在使用 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 列第 2 行和第 0 列第 5 列预期通过

【问题讨论】:

    标签: excel perl


    【解决方案1】:

    这是一个记录在案的问题(请参阅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"),并将计算值写为简单值,而不是公式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2018-04-22
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多