2014-12-24 4 views
1

기본적으로 link에있는 코드의 수정 된 버전 인 perl 스크립트를 사용하여 여러 CSV 파일을 Excel 스프레드 시트로 변환했지만 출력 파일을 열 수 없습니다. 팝업 메시지 "파일이 손상되었습니다."CSV로 Excel 변환하기 파일이 손상됨

#!/usr/intel/bin/perl -W 

use strict; 
use Spreadsheet::WriteExcel::Big; 
use Text::CSV_XS; 

# Check for valid number of arguments 
if (($#ARGV < 1) || ($#ARGV > 2)) { 
    die("Usage: csv2xls csvfile_dir xlsfile\n"); 
}; 

my $csvdir = $ARGV[0]; 
my $outfile = $ARGV[1]; 


# Create a new Excel workbook 
my $workbook = Spreadsheet::WriteExcel::Big->new($outfile); 
my $csvfile = ""; 
my $tab_title = ""; 

foreach $csvfile (glob("$csvdir/*.csv")) { 
    print "$csvfile\n"; 
    # Open the Comma Separated Variable file 
    open (CSVFILE, $csvfile) or die "$csvfile: $!"; 
    $csvfile =~ s/.*\///; 
    $tab_title = (split(/\./,$csvfile))[0]; 
    print "-D- $tab_title\n"; 

    # Create a new Excel worksheet 
    my $worksheet = $workbook->add_worksheet($tab_title); 

    # Create a new CSV parsing object 
    my $csv = Text::CSV_XS->new; 

    # Row and column are zero indexed 
    my $row = 0; 

    while (<CSVFILE>) { 
     if ($csv->parse($_)) { 
      my @Fld = $csv->fields; 
      print "-D- @Fld\n"; 
      my $col = 0; 
      foreach my $token (@Fld) { 
       $worksheet->write($row, $col, $token); 
       $col++; 
      } 
      $row++; 
     } else { 
      my $err = $csv->error_input; 
      print "Text::CSV_XS parse() failed on argument: ", $err, "\n"; 
     } 
    } 
} 

어떻게 수정할 수 있습니까?

답변

0

통합 문서를 닫아야합니다.

$workbook->close(); 

는 또한 최신 버전으로 엑셀 모듈을 업그레이드 또한 Spreadsheet::WriteExcel 업데이트에 대한 해결되었다 손상된 엑셀 파일의 유사한 문제에 직면했다. bin 파일 모드에 대한 요구 사항에 대한 docs

주에서 또한

(). Excel 파일은 이진 데이터의 으로 구성됩니다. 따라서 파일 핸들을 사용하는 경우 을 new()에 전달하기 전에 binmode()를 수행해야합니다. 은 사용자가 Windows 플랫폼을 사용하는지 여부에 관계없이 수행해야합니다. 이것은 특히 UTF-8이 RedHat Linux 9와 같은 운영 중에있는 인 시스템에서 perl 5.8 사용자에게 적용됩니다. 프로그램이 의도적으로 또는 아니게 실행되면 인 파일 핸들에 UTF-8 데이터를 씁니다 new()에 생성 된 Excel 파일이 손상됩니다.

관련 문제