0

我使用 Perl 模块 Excel::Writer::XLSX。如果我在数据检查下直接在 excel 中输入该函数,它就可以工作。Perl 脚本的修改形式不起作用。

我的 Excel 文件中有一些工作表。在“数据验证”->“列表”下,我将其用作“源”:

=BEREICH.VERSCHIEBEN(Boden_Subtyp!$E:$G;1;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E$1:$G$1;0)-1;ANZAHL2(INDEX(Boden_Subtyp!$E:$G;;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E$1:$G$1;0)));1)

有用。

如果我在我的 Perl 脚本中以修改后的形式使用它来创建具有此功能的 Excel 文件,那么我将无法打开 Excel 文件。修改后的表格:

=BEREICH.VERSCHIEBEN('Boden_Subtyp'!$E:$G;1;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$1;0)-1;ANZAHL2(INDEX('Boden_Subtyp'!$E:$G;;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$1;0)));1)

代码截断:

$validate_source = "=BEREICH.VERSCHIEBEN('Boden_Subtyp'!$E:$G;1;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$1;0)-1;ANZAHL2(INDEX('Boden_Subtyp'!$E:$G;;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$1;0)));1)";
$profil_zugriffshash -> data_validation(
    $iii,$spaltenzaehler,
    {
        validate => 'list',
        source   => "$validate_source",
    }
);

如果创建了 Excel 文件,我将使用 Excel 打开它并得到错误:找到了 excel 的不可读内容...

4

2 回答 2

1

这不是问题的解决方案。我简化了问题。该脚本会创建一个 Excel 可以正确读取的文件。如果使用注释源条目,Excel 会报告错误。但是,注释的源条目可以直接交换为 Excel 中未注释的源条目。

#!/usr/bin/perl -w
use diagnostics;
use strict;
use warnings;
use Excel::Writer::XLSX;

my $workbook  = Excel::Writer::XLSX->new( '/home/nutzer/test_bereich_verschieben.xlsx' );
my $home_hash = $workbook->add_worksheet('Home');
$home_hash -> write(0, 0, 'range_val');
$home_hash -> data_validation(
    1,0,
    {
        validate => 'list',
        source   => 'Horizont!$C$5:$C$6',       # list: 2 and 3
#       source   => '=BEREICH.VERSCHIEBEN(Horizont!$C:$E;3;0;3;1)', # list: 1 and 2 and 3
    }
);

my $horizont_hash = $workbook->add_worksheet('Horizont');
$horizont_hash -> write(3, 2, '1');
$horizont_hash -> write(4, 2, '2');
$horizont_hash -> write(5, 2, '3');

$workbook->close;
exit;   
__END__
于 2019-05-20T10:09:54.827 回答
1

来自Excel::Writer::XLSX文档,但为了清楚起见在此重复:

非美国 Excel 函数和语法

Excel 以美国英语版本的格式存储公式,而与最终用户版本的 Excel 的语言或区域设置无关。因此,所有使用 Excel::Writer::XLSX 编写的公式函数名称必须是英文:

    worksheet->write_formula('A1', '=SUM(1, 2, 3)');   # OK
    worksheet->write_formula('A2', '=SOMME(1, 2, 3)'); # French. Error on load.

此外,公式必须使用逗号(不是分号)的美式分隔符/范围运算符编写。因此,具有多个值的公式应编写如下:

    worksheet->write_formula('A1', '=SUM(1, 2, 3)'); # OK
    worksheet->write_formula('A2', '=SUM(1; 2; 3)'); # Semi-colon. Error on load.

如果您有非英语版本的 Excel,您可以使用以下多语言公式翻译器 ( http://en.excel-translator.de/language/ ) 来帮助您转换公式。它还可以用逗号替换分号。

使用上面列出的转换器,公式应该是:

OFFSET('Boden_Subtyp'!$E:$G,1,MATCH('Profil'!$G$2,'Boden_Subtyp'!$E$1:$G$1,0)-1,COUNTA(INDEX('Boden_Subtyp'!$E:$G,,MATCH('Profil'!$G$2,'Boden_Subtyp'!$E$1:$G$1,0))),1)
于 2020-03-01T14:26:55.640 回答