how to use perl to operate excel

10831 단어
Excel 파일을 해석하는 것은 아무리 봐도 어려운 난제를 제기했다.작년까지만 해도 UNIX 모듈은 전혀 사용할 수 없었고 Win32::OLE 모듈로만 Windows Excel 파일에서 데이터를 검색할 수 있었다.그러나 두 명의 Perl 고수와 많은 자원봉사자들의 도움과 헌신으로 상황은 결국 바뀌었다!
Spreadsheet::WriteExcel 및 Spreadsheet::ParseExcel
2000년에 Takanori Kawai와 John McNamara는 Spreadsheet::WriteExcelSpreadsheet::ParseExcel 모듈을 작성하여 CPAN에 붙였다. 이 두 모듈은 어떤 플랫폼에서든 Excel 파일에서 데이터를 추출할 수 있게 했다.
나중에 볼 수 있듯이 Windows를 사용하고 있다면, Win32::OLE 더욱 간단하고 신뢰할 수 있는 해결 방안을 제공하고 Spreadsheet::WriteExcel 모듈은 Win32::OLE 를 사용하여 더욱 강력한 데이터와 워크시트 조작을 권장합니다.Win32::OLE 다른 Windows 응용 프로그램을 OLE를 통해 구동할 수 있는 ActiveState Perl 도구 상자가 있습니다.이 모듈을 사용하려면 시스템에 Excel 엔진을 설치하고 등록해야 합니다(일반적으로 Excel 자체에 따라 설치).
Excel 데이터를 분석해야 하는 응용 프로그램은 수천 개에 달하지만, 여기에는 Excel을 CSV로 내보내고, 공유 드라이브에 저장된 스프레드시트와 상호작용을 하고, 금융 데이터를 데이터베이스로 옮겨 보고서를 작성하고, 다른 형식을 제공하지 않는 상황에서 데이터를 분석하는 몇 가지 예가 있다.
이 예제를 설명하려면 시스템에 Perl 5.6.0을 설치해야 합니다.시스템은 가장 최근(2000년 이후)의 메인스트림 UNIX 설치(Linux, Solaris 및 BSD)입니다.이 예들은 이전 버전의 Perl과 UNXI 및 다른 운영체제에서도 사용할 수 있지만, 연습으로 사용할 수 없는 상황에 직면하게 될 것을 고려해야 합니다.
페이지 맨 위로 돌아가기
Windows 예: 확인
이 섹션은 Windows 시스템에만 적용됩니다.다른 모든 섹션은 Linux에 적용됩니다.
진행하기 전에 버전 628 또는 ActiveState Komodo IDE를 설치하여 Perl을 편집하고 디버깅하십시오.Komodo는 가정 사용자에게 무료 허가증을 제공합니다. 몇 분 안에 받을 수 있습니다.(다운로드 사이트에 대해서는 본문 뒤의 참고 자료를 참조하십시오.)
ActiveState PPM 패키지 관리자를 사용하여 Spreadsheet::ParseExcelSpreadsheet::WriteExcel 모듈을 설치하는 것은 어렵습니다.PPM에 기록이 없기 때문에 옵션을 설정하기 어렵습니다. 도움말은 화면에서 꺼지고 기본값은 관련성을 무시하고 설치하는 것입니다.명령줄에서 "ppm"을 입력하고 다음 명령을 실행하여 PPM을 호출할 수 있습니다.
목록 1: Excel 모듈을 설치하는 PPM 명령
ppm> install OLE::Storage_Lite
ppm> install Spreadsheet::ParseExcel
ppm> install Spreadsheet::WriteExcel

 
이 경우 이 모듈의 설치가 실패합니다. IO::Scalar 아직 사용할 수 없기 때문에 PPM 문제 검색을 포기하고 내장된 Win32::OLE 모듈로 전환할 수 있습니다.그러나 이 문제를 읽을 때 ActiveState에서 수정을 발표했을 수도 있습니다.
ActiveStateWin32::OLE가 있으면 아래 나열된 코드를 사용하여 워크시트를 한 단위씩 저장할 수 있습니다.
win32excel을 다운로드합니다.pl
명세서 2: win32excel.pl
#!/usr/bin/perl -w
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;                                # die on errors...
# get already active Excel application or open new
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
    || Win32::OLE->new('Excel.Application', 'Quit');  
# open Excel file
my $Book = $Excel->Workbooks->Open("c:/komodo projects/test.xls"); 
# You can dynamically obtain the number of worksheets, rows, and columns
# through the Excel OLE interface.  Excel's Visual Basic Editor has more
# information on the Excel OLE interface.  Here we just use the first
# worksheet, rows 1 through 4 and columns 1 through 3.
# select worksheet number 1 (you can also select a worksheet by name)
my $Sheet = $Book->Worksheets(1);
foreach my $row (1..4)
{
 foreach my $col (1..3)
 {
  # skip empty cells
  next unless defined $Sheet->Cells($row,$col)->{'Value'};
 # print out the contents of a cell  
  printf "At ($row, $col) the value is %s and the formula is %s/n",
   $Sheet->Cells($row,$col)->{'Value'},
   $Sheet->Cells($row,$col)->{'Formula'};        
 }
}
# clean up after ourselves
$Book->Close;

 
다음 방법으로 셀에 쉽게 값을 할당할 수 있습니다.
$sheet->Cells($row, $col)->{'Value'} = 1;

 
페이지 맨 위로 돌아가기
Linux 예: 분석
이 섹션은 UNIX, 특히 Linux에 적용됩니다.Windows에서 테스트하지 않았습니다.Spreadsheet::ParseExcel 모듈 문서에서 제공한 예시보다 더 좋은 Linux 해석 예시를 제시하기 어렵기 때문에 나는 그 예시를 보여 주고 그 작업 원리를 설명할 것이다.
parse-excel을 다운로드합니다.pl
명세서 3:parse-excel.pl
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
my $oExcel = new Spreadsheet::ParseExcel;
die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;
my $oBook = $oExcel->Parse($ARGV[0]);
my($iR, $iC, $oWkS, $oWkC);
print "FILE  :", $oBook->{File} , "/n";
print "COUNT :", $oBook->{SheetCount} , "/n";
print "AUTHOR:", $oBook->{Author} , "/n"
 if defined $oBook->{Author};
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++)
{
 $oWkS = $oBook->{Worksheet}[$iSheet];
 print "--------- SHEET:", $oWkS->{Name}, "/n";
 for(my $iR = $oWkS->{MinRow} ;
     defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;
     $iR++)
 {
  for(my $iC = $oWkS->{MinCol} ;
      defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;
      $iC++)
  {
   $oWkC = $oWkS->{Cells}[$iR][$iC];
   print "( $iR , $iC ) =>", $oWkC->Value, "/n" if($oWkC);
  }
 }
}

 
이 예는 Excel 97로 테스트되었습니다.만약 그것이 작동할 수 없다면, 그것을 Excel 97 형식으로 변환해 보세요.Spreadsheet::ParseExcel의perldoc 페이지도 Excel 95와 2000의 호환성을 주장했다.
스프레드시트는 $oBook이라는 최상위 객체로 해석됩니다. $oBook에는 File, SheetCount 및 Author 등의 보조 프로그램 기능이 있습니다.Spreadsheet::ParseExcel의perldoc 페이지의 워크북 1절에 이러한 특성이 기재되어 있다.
이 워크북에는 워크북 SheetCount 특성을 사용하여 여러 개의 워크시트가 포함되어 있습니다.모든 작업표에는 MinRow와 MinCol, 그리고 그에 상응하는 MaxRow와 MaxCol 기능이 있습니다. 이 작업장에 접근할 수 있는 범위를 정하는 데 사용할 수 있습니다.Spreadsheet::ParseExcelperldoc 페이지의 작업표 1절에 이러한 특성이 기재되어 있다.
Cell 특성을 통해 워크시트에서 단원을 얻을 수 있습니다.그것이 바로 명세서 3에서 $oWkC 대상을 얻는 방식이다.Spreadsheet::ParseExcel의perldoc 페이지의 Cell 섹션에는 Cell 특성이 기재되어 있습니다.문서에 따르면 특정 단원에 열거된 공식을 얻을 수 있는 방법은 없을 것 같다.
페이지 맨 위로 돌아가기
Linux 예: 쓰기
이 섹션은 UNIX, 특히 Linux에 적용됩니다.Windows에서 테스트하지 않았습니다.Spreadsheet::WriteExcel Examples 디렉터리에 많은 예시 스크립트가 있습니다. 보통/usr/lib/perl5/site_perl/5.6.0/Spreadsheet/WriteExcel/examples에서 이 스크립트를 찾을 수 있습니다.그것은 다른 곳곳에 설치될 수 있다.디렉토리를 찾을 수 없으면 로컬 Perl 관리자에게 문의하십시오.
잘못된 메시지는 Spreadsheet::WriteExcel 기존 Excel 파일에 쓸 수 없다는 것입니다.기존 Excel 파일에서 데이터를 가져오려면 직접 Spreadsheet::ParseExcel 를 사용해야 합니다.좋은 소식은 Excel 5에서 Excel 2000까지 호환된다는 것입니다.
Excel 파일에서 데이터를 추출하고 수정하고 (모든 숫자에 2를 곱한) 데이터를 새 Excel 파일에 쓰는 방법을 보여 주는 프로그램이 있습니다.데이터만 보존하고 형식과 특성은 보존하지 않습니다.공식이 버려지다.
excel-x2 다운로드pl
명세서 4: excel-x2.pl
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Data::Dumper;
# cobbled together from examples for the Spreadsheet::ParseExcel and
# Spreadsheet::WriteExcel modules
my $sourcename = shift @ARGV;
my $destname = shift @ARGV or 
           die "invocation: $0 <source file> <destination file>";
my $source_excel = new Spreadsheet::ParseExcel;
my $source_book = $source_excel->Parse($sourcename)
 or die "Could not open source Excel file $sourcename: $!";
my $storage_book;
foreach my $source_sheet_number (0 .. $source_book->{SheetCount}-1)
{
 my $source_sheet = $source_book->{Worksheet}[$source_sheet_number];
 print "--------- SHEET:", $source_sheet->{Name}, "/n";
 # sanity checking on the source file: rows and columns should be sensible
 next unless defined $source_sheet->{MaxRow};
 next unless $source_sheet->{MinRow} <= $source_sheet->{MaxRow};
 next unless defined $source_sheet->{MaxCol};
 next unless $source_sheet->{MinCol} <= $source_sheet->{MaxCol};
 foreach my $row_index ($source_sheet->{MinRow} .. 
        $source_sheet->{MaxRow})
 {
  foreach my $col_index ($source_sheet->{MinCol} .. 
        $source_sheet->{MaxCol})
  {
   my $source_cell = $source_sheet->{Cells}[$row_index][$col_index];
   if ($source_cell)
   {
    print "( $row_index , $col_index ) =>", $source_cell->Value, "/n";
    if ($source_cell->{Type} eq 'Numeric')
    {
  $storage_book->{$source_sheet->{Name}}->{$row_index}-
       >{$col_index} = $source_cell->Value*2;
    }
    else
    {
  $storage_book->{$source_sheet->{Name}}->{$row_index}-
          >{$col_index} = $source_cell->Value;
    } # end of if/else
   } # end of source_cell check
  } # foreach col_index
 } # foreach row_index
} # foreach source_sheet_number
print "Perl recognized the following data (sheet/row/column order):/n";
print Dumper $storage_book;
my $dest_book  = Spreadsheet::WriteExcel->new("$destname")
 or die "Could not create a new Excel file in $destname: $!";
print "/n/nSaving recognized data in $destname...";
foreach my $sheet (keys %$storage_book)
{
 my $dest_sheet = $dest_book->addworksheet($sheet);
 foreach my $row (keys %{$storage_book->{$sheet}})
 {
  foreach my $col (keys %{$storage_book->{$sheet}->{$row}})
  {
   $dest_sheet->write($row, $col, $storage_book->{$sheet}->{$row}->{$col});
  } # foreach column
 } # foreach row
} # foreach sheet
$dest_book->close();
print "done!/n";

 
주의해야 할 것은 프로그램의 데이터 추출과 저장 부분은 반드시 분리되어야 한다는 것이다.그것들은 원래 동시에 진행할 수 있지만, 그것들을 분리함으로써 오류 복구와 개선을 쉽게 할 수 있다.
상술한 문제에 대해 훨씬 좋은 해결 방안은 Spreadsheet::WriteExcel CPAN 모듈을 통해 실현될 수 있지만, XML을 Excel로 변환하는 특수 변환기를 작성해야 한다.그런 식으로 데이터를 가져오려면 XML::Excel 모듈을 통해 DBI 인터페이스를 사용할 수도 있습니다.마지막으로 DBD::Excel 모듈은 두 Excel 파일 간에 변환할 수 있다고 주장하지만 문서와 예시가 없습니다.내 사이트(참고자료 참조)는 사용Spreadsheet::ParseExcel의 예시를 보여 주었다.사전 경고: 그것은 실험형 프로그램으로 문제가 생기기 쉽다.
페이지 맨 위로 돌아가기
끝말
Windows 시스템을 사용하고 있는 경우 Excel이 전혀 없는 한 모듈Spreadsheet::ParseExcel::SaveParser을 계속 사용하십시오.SaveParserWin32::OLE 모듈의 기능이 끊임없이 보완되고 있지만 Spreadsheet::WriteExcel 현재 Excel 데이터를 얻는 가장 간편한 방식이다.
UNIX, 특히 Linux에서는 Spreadsheet::ParseExcelWin32::OLE 모듈을 사용하여 Excel 데이터에 프로그래밍 액세스하십시오.그러나 사전 경고: 그것들은 여전히 상당히 성숙하지 않은 모듈입니다. 만약 안정성이 필요하다면, 그것들은 당신에게 적합하지 않을 수도 있습니다.
Gnumeric 및 StarOffice (참고 자료 참조) 와 같은 패키지는 무료로 구할 수 있으며, 완전한 GUI 인터페이스와 Excel 파일의 가져오기/내보내기 기능을 제공합니다.Excel 데이터에 대한 프로그래밍 액세스가 필요하지 않으면 유용합니다.이 두 응용 프로그램을 나는 모두 사용한 적이 있는데, 나는 그것들이 일상적인 업무에 매우 좋다는 것을 발견했다
 
http://www.ibm.com/developerworks/cn/linux/sdk/perl/culture-8/

좋은 웹페이지 즐겨찾기