2014-11-14 82 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