Формат поля даты изменяется через Spreadsheet::ParseExcel

У меня есть таблица Excel (A.xls) со следующим содержанием:

               Date,Value
         10/1/2020,36.91
         10/2/2020,36.060001

Я получил следующий результат, используя тот же сценарий с Perl v5.6.1 на solaris 5.8.

               >>./a4_test.pl
         INFO>Excel File=A.xls,#WorkSheet=1,AuthorID=Sahoo, Ashish
         DEBUG>row 2 - col 0:10-2-20
         DEBUG>row 2 - col 1:36.060001

И я получил другой вывод для поля даты, используя тот же скрипт с perl v5.26.3 на solaris 5.11

               >>./a4_test.pl
         INFO>Excel File=A.xls,#WorkSheet=1,AuthorID=Sahoo, Ashish
         DEBUG>row 2 - col 0:2020-10-02
         DEBUG>row 2 - col 1:36.060001

Я использовал версию 0.2602 на машине Solaris 8 и версию 0.65 на машине Solaris 11.

Почему при чтении поля даты с
листа Excel через Spreadsheet::ParseExcel модуль?

          #!/usr/perl/5.12/bin/perl -w
    use Spreadsheet::ParseExcel;

    my $srce_file = "a.xls"; 
    my $oExcel = new Spreadsheet::ParseExcel;
    my $oBook = $oExcel->Parse($srce_file); 
    my %hah_sheet = ();
    my $header_row  = 1;
        my($iR, $iC, $oWkS, $oWkC);
        my $book = $oBook->{File};
        my $nsheet= $oBook->{SheetCount};
        my $author= $oBook->{Author};
        unless($nsheet){
            print "ERR>No worksheet found for source file:$srce_file\n";
            return 0;
        }
        else{
            print "INFO>Excel                         
           File=$srce_file,#WorkSheet=$nsheet,AuthorID=$author\n";
        }


   for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
    next if($iSheet >0);    
    $oWkS = $oBook->{Worksheet}[$iSheet];

    my $rows = 0;
    for(my $iR = $oWkS->{MinRow}; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
        $rows++;

        my $str_len = 0;
        for(my $iC = $oWkS->{MinCol}; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol}; $iC++) {
            $oWkC = $oWkS->{Cells}[$iR][$iC];
            next if ($iR <$header_row);
            
            if (defined($oWkC)){
                my $cell_value = $oWkC->Value;
                $cell_value =~s/\n+//g;               #removed newline inside the value
                #
                ##if the first column at header row is null then skip. Column might be shifted
                if($iR==$header_row && $iC == 0){
                    last unless($cell_value);
                }
                if($iR == $header_row){
                   $hah_sheet{$iR}{$iC} = uc($cell_value);
                }else {
                   $hah_sheet{$iR}{$iC} = $cell_value;
                   $str_len += length($cell_value);  
                   ##View cell value by row/column
                   print "DEBUG>row ${iR} - col ${iC}:$cell_value\n";
                }
            }else{
                $hah_sheet{$iR}{$iC} = "";              #keep position for NULL value
            }
        } # END of Column loop
    } # END of Row loop
} # END of Worksheet
      

1 ответ

Если вы выполните поиск по запросу «дата» в разделе « Изменения» , то увидите следующее:

      0.33 2008.09.07
    - Default format for formatted dates changed from 'm-d-yy' to 'yyyy-mm-dd'

Это объясняет, почему вы видите разные форматы даты в версиях 0.2602 и 0.65 Spreadsheet::ParseExcel.

Если вы всегда хотите, чтобы ваш код печатал один и тот же формат, независимо от того, какую версию вы используете, вы можете преобразовать дату в своем коде. Например, если вы всегда хотите видеть yyyy-mm-dd:

      $cell_value =~ s/^(\d+)-(\d+)-(\d+)$/sprintf '%04d-%02d-%02d', 2000+$3, $1, $2/e;
Другие вопросы по тегам