Perl Excel::Writer::XLSX Excel函数Move Area.function的正确语法

Perl Excel::Writer::XLSX Excel函数Move Area.function的正确语法,perl,validation,drop-down-menu,excel-writer-xlsx,Perl,Validation,Drop Down Menu,Excel Writer Xlsx,我使用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;;VERGL

我使用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的不可读内容…

这不是问题的解决方案。我简化了这个问题。该脚本将创建一个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__

这不是问题的解决办法。我简化了这个问题。该脚本将创建一个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__
根据文件,但为了清晰起见,此处重复:

非美国Excel函数和语法

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

工作表->编写公式('A1','=SUM(1,2,3);#好啊
工作表->编写公式('A2','=SOMME(1,2,3);#法语加载时出错。
此外,公式必须使用美式分隔符/范围运算符编写,该运算符是逗号(而不是分号)。因此,具有多个值的公式应编写如下:

工作表->编写公式('A1','=SUM(1,2,3);#好啊
工作表->写公式('A2','=和(1;2;3);#分号。加载时出错。
如果您有非英语版本的Excel,可以使用以下多语言公式转换器()来帮助您转换公式。它还可以用逗号代替分号

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

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)
根据文件,但为了清晰起见,此处重复:

非美国Excel函数和语法

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

工作表->编写公式('A1','=SUM(1,2,3);#好啊
工作表->编写公式('A2','=SOMME(1,2,3);#法语加载时出错。
此外,公式必须使用美式分隔符/范围运算符编写,该运算符是逗号(而不是分号)。因此,具有多个值的公式应编写如下:

工作表->编写公式('A1','=SUM(1,2,3);#好啊
工作表->写公式('A2','=和(1;2;3);#分号。加载时出错。
如果您有非英语版本的Excel,可以使用以下多语言公式转换器()来帮助您转换公式。它还可以用逗号代替分号

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

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)

在Perl中使用字符串时,为什么要修改它?使用原始版本时会发生什么情况?
$E
在Perl中的双引号内插入
$E
变量的值。使用
q()
而不是双引号来防止插值。如果我使用与Excel相同的代码,我会得到相同的错误。我之所以更改字符串,是因为我在互联网上找到了一个示例。我测试了q(),两个字符串上的错误是相同的:$validate_source=q(=BEREICH.VERSCHIEBEN('Boden_Subtyp'!$E:$G;1;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$0)-1;ANZAHL2(INDEX('Boden_Subtyp'!$E:$E:$G!$G;$G;$2;'Boden_Subtyp')$1;$0));1);和$validate_source=q(=BEREICH.VERSCHIEBEN(Boden_Subtyp!$E:$G;1;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E:$G$1;0)-1;ANZAHL2(索引(Boden_Subtyp!$E:$G;;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E$1:$G$1;0));1));有没有可能它不喜欢德语Excel公式?为什么在Perl中使用字符串时要修改它?使用原始版本时会发生什么情况?
$E
在Perl中的双引号内插入
$E
变量的值。使用
q()
而不是双引号来防止插值。如果我使用与Excel相同的代码,我会得到相同的错误。我之所以更改字符串,是因为我在互联网上找到了一个示例。我测试了q(),两个字符串上的错误是相同的:$validate_source=q(=BEREICH.VERSCHIEBEN('Boden_Subtyp'!$E:$G;1;VERGLEICH('Profil'!$G$2;'Boden_Subtyp'!$E$1:$G$0)-1;ANZAHL2(INDEX('Boden_Subtyp'!$E:$E:$G!$G;$G;$2;'Boden_Subtyp')$1;$0));1);和$validate_source=q(=BEREICH.VERSCHIEBEN(Boden_Subtyp!$E:$G;1;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E:$G$1;0)-1;ANZAHL2(索引(Boden_Subtyp!$E:$G;;VERGLEICH(Profil!$G$2;Boden_Subtyp!$E$1:$G$1;0));1));有没有可能它不喜欢德国的Excel公式?