2014-11-14 47 views
0

到csv我有线条一批Excel文件一样阅读日期通过Perl的

1/13/04 21 

我想将它们转换为.csv,但发现该行被转换成

36537,21 

事实证明,这是excel存储规则的一个副作用。 Excel应该将日期存储为自1900年1月1日以来的日期。按照该规则,这是错误的整数,对应于2001年1月12日和2004年1月13日(即1/13/04表示的日期)。

  • Excel究竟是怎么犯这个错误的?
  • 我怎样才能得到原始的未格式化的值,在这里避开转换?

这是代码的草图:

my $xlsparser = Spreadsheet::ParseExcel->new(); 
my $xlsbook = $xlsparser->Parse('xls_test.xls'); 
my $xls = $xlsbook->{Worksheet}[0]; 
my $csv = ''; 

# then a loop over rows and columns with... 
    my $cell = $xls->get_cell($row, $col); 
    $cellcon = $cell->unformatted(); 
    $csv .= $cellcon; 

如果我的阐述不够清晰,或者您不能重现该问题,这里是一个最小数据集和脚本重现这对我来说:

https://dl.dropboxusercontent.com/u/58760/softwareGrr/xls_example.pl https://dl.dropboxusercontent.com/u/58760/softwareGrr/junk.xls

+0

我无法重现。 '01/13/04'在Excel中被转换为'37999'。你使用什么版本? – Degustaf 2014-11-14 20:56:46

+0

对于我在做的事情,我不应该使用Excel;一切都在Perl(版本5.16.3,Win x64,Spreadsheet :: ParseExcel包的0.65版本)中。我正在看的文件根据其元数据采用Excel 97-2003格式。我会看看我是否可以从(机密)文件中摘录一个日期并看到相同的结果(在这种情况下,我将把它放在Dropbox上)。 – Frank 2014-11-14 21:14:29

+0

@Degustaf我添加了一个指向我的计算机上重现问题的文件的链接。 – Frank 2014-11-14 21:25:58

回答

0

有问题的路线是

$cellcon = $cell->unformatted(); 

除非有人能提供更好的解释,否则我会将其视为一个错误。我替换的行是

$cellcon = $cell->Value; 
+0

我仍然不知道我的问题的第一部分(为什么Excel在1900年1月1日以来提供了错误的整数),但在这一点上并不在乎。如果有人能回答,当然,我会接受他们的回答,而不是我的回答。 – Frank 2014-11-14 17:56:17