为什么Spreadsheet :: XLSX在不同的机器上解析日期不一致?

时间:2016-02-18 22:34:21

标签: excel perl

我创建了一个从XLSX表读取信息的Perl脚本。因为在一台机器上它运行良好,而在另一台机器上它没有,我包括一个简短的调试部分:

$sheetdate = ($sheet -> {Cells} [0] [$sheet->{MaxCol}]) -> value();
print "value: $sheetdate\n";
$sheetdate = ($sheet -> {Cells} [0] [$sheet->{MaxCol}]) -> get_format();
print "getformat: $sheetdate\n";

在一台机器上打印出来:

value: 2016-01-18
getformat: yyyy-mm-dd

而在另一方面:

value: 1-18-16
getformat: m-d-yy

相同的脚本,相同的工作表,不同的结果。我相信环境中的某些东西会带来不同,但我不知道到底是什么。

任何提示?

3 个答案:

答案 0 :(得分:2)

“相同的脚本,相同的工作表,不同的结果。我相信环境中的某些东西会有所不同,但我不知道到底是什么。”

你自己在这里指出,你并没有真正寻求解决perl或XLSX问题的解决方案,而是帮助解决环境问题。

无法访问环境本身很难提供解决方案,但我可以这样说 - 你需要;

1)重新安排事情,以便从两个环境中获得相同的结果;

2)确定原始问题环境与现在“有效”环境之间的差异列表;和

3)一次修改列表中的一件事 - 向有效的环境移动 - 每次检查,直到变得清楚关键变量(不是编程意义上)是什么。

关于(1),请看Strawberry Perl。使用Strawberry,相对容易设置一些叫做 Perl on a stick (参见Portable ZIP edition) - USB记忆棒上的完整perl环境。将您的文档放在同一个USB上,然后尝试两个环境 - 这次绝对确定具有相同的环境。如果不同的结果仍然存在,请尝试从“live environement”DVD(适当的Linux或widows)启动,然后使用USB。

最终,我建议在游戏中有一些东西(例如电子表格模板),环境之间是不同的。你只需要经过一个消除过程来找出它是什么。

答案 1 :(得分:1)

事后看来,我认为值得重新审视,以便为将来遇到此问题的人提供简洁的答案。

最初的问题是,如果输入的excel数据文件相同(使用MD5校验和确认),perl脚本如何产生两种不同的结果。作为程序员,我们的重点往往放在我们编写的脚本和进入它们的数据上。无论如何都可以安装和配置perl本身的方法。

有助于确定两个安装之间差异的三个方面是:

(1)如上所述在棍子上使用草莓perl,使环境脱离等式,从而(如果问题"消失")确认问题与环境有关。

(2)自由地使用Data::Dumper来找到执行流程的位置。"

(3)比较perl -V的输出(注意大写字母V),以确定各个perls的构建和配置方式是否存在差异。

答案 2 :(得分:1)

问题的根本原因是从分发存储库安装为RPM的过时的Spreadsheet :: XLSX cpan模块。 RPM包括该模块的0.13版本,在CPAN中已经有版本0.15,并且从版本0.14开始,模块的行为在这个特定方面发生了变化。因此,一旦我用直接从CPAN下载并在本地编译的版本替换预编译模块,问题就解决了。