2009-09-02 8 views
7

Spreadsheet::WriteExcel을 사용하면 새 통합 문서를 만들 수 있지만 기존 책을 열고 특정 열을 수정하려면 어떻게해야합니까? 나는 그것을 어떻게 성취 할 것인가?Perl로 기존 Excel 통합 문서를 수정하려면 어떻게해야합니까?

을 사용하여 시트의 모든 데이터를 구문 분석 한 다음 Spreadsheet::WriteExcel을 사용하여 특정 행/열에 새 값으로 다시 쓸 수 있습니다. 이미 두 모듈을 결합한 모듈이 있습니까?

주로 나는 단지 .xls을 열어 특정 행/열을 덮어 쓰고 싶습니다.

답변

13

Spreadsheet::ParseExcel은 기존의 엑셀 파일에 읽습니다 :

my $parser = Spreadsheet::ParseExcel->new(); 
# $workbook is a Spreadsheet::ParseExcel::Workbook object 
my $workbook = $parser->Parse('Book1.xls'); 

하지만 당신이 정말로 원하는 하는 Spreadsheet::ParseExcelSpreadsheet::WriteExcel의 조합 Spreadsheet::ParseExcel::SaveParser,입니다. 문서 하단에는 example이 있습니다.

+0

ParseExcel을 사용하여 Excel 서적에 쓸 방법이 보이지 않습니다. – user105033

+0

Spreadsheet :: ParseExcel :: SaveParser가이를 수행합니다. 당신이 내 편집을 이겼어. :) – Ether

3

Modifying and Rewriting Spreadsheets을 다루는 Spreadsheet :: WriteExcel 문서 섹션이 있습니다.

Excel 파일은 이진 파일 내의 이진 파일입니다. 여기에는 여러 개의 상호 연결된 체크섬이 포함되어 있으며 한 바이트라도 변경하면 손상 될 수 있습니다.

마찬가지로 Excel 파일을 단순히 추가하거나 업데이트 할 수는 없습니다. 이를 달성하는 유일한 방법은 전체 파일을 메모리로 읽어 들이고 필요한 변경 또는 추가를 한 다음 다시 파일을 쓰는 것입니다.

Spreadsheet :: ParseExcel 및 Spreadsheet :: WriteExcel에 대한 래퍼 인 Spreadsheet :: ParseExcel :: SaveParser 모듈을 사용하여 Excel 파일을 읽고 다시 작성할 수 있습니다. 이 패키지는 Spreadsheet::ParseExcel 패키지의 일부입니다.

예도 있습니다.

1

Spreadsheet::ParseExcel::SaveParser 모듈은 Spreadsheet :: ParseExcel 및 Spreadsheet :: WriteExcel에 대한 래퍼입니다.

나는 최근에 내가 희망하는 문서를 is a clearer example of how to do this으로 업데이트했다.

+0

나는 아직도이 예제를 얻지 못했다. SaveAs가 수락하는 것에 대한 설명서를 찾을 수 없습니다. 파일 핸들 대신 스칼라 참조 또는 파일 핸들을 전달할 수 있습니까? – Myforwik

+0

죄송합니다. John McNamara가 write_to_scalar.pl 파일을 패키지에 포함 시켰습니다.그것을 사용하여 XLS 파일의 메모리 수정 메모리를 만들 수있었습니다 : - D – Myforwik

9

Excel이 설치되어있는 경우 Win32::OLE을 사용하면 거의 문제가 없습니다. - 엑셀 및 워드 자동화에 이르기까지 모든

use Win32::OLE; 

# use existing instance if Excel is already running 
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; 
die "Excel not installed" if [email protected]; 
unless (defined $ex) { 
    $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) 
      or die "Oops, cannot start Excel"; 
} 

# get a new workbook 
$book = $ex->Workbooks->Add; 

# write to a particular cell 
$sheet = $book->Worksheets(1); 
$sheet->Cells(1,1)->{Value} = "foo"; 

# write a 2 rows by 3 columns range 
$sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], 
            [ 42, 'Perl', 3.1415 ]]; 

# print "XyzzyPerl" 
$array = $sheet->Range("A8:C9")->{Value}; 
for (@$array) { 
    for (@$_) { 
     print defined($_) ? "$_|" : "<undef>|"; 
    } 
    print "\n"; 
} 

# save and exit 
$book->SaveAs('test.xls'); 
undef $book; 
undef $ex; 

기본적으로, Win32::OLE 당신에게 일의 거대한 다양성을 포함하는 VBA 또는 Visual Basic 응용 프로그램, 사용할 수 있습니다 모든 것을 제공 : 여기 Win32::OLE의 자체 문서의 예입니다 Windows Script Host를 통해 네트워크 드라이브를 열거하고 탑재하는 방법에 대해 설명합니다. 그것은 ActivePerl의 지난 몇 판과 표준이되었습니다.

+1

또한, 당신은 한번에 \ rows에 전체 배열을 쓸 수 있으며 쓰기 속도에 영향을줍니다. 충분하지 않은 경우 매크로가있는 Excel에이 모듈을 사용하여 작성할 수도 있습니다. –

+0

감사합니다. Spreadsheet :: ParseXLSX :: SaveParser가 존재하지 않는다는 것을 알게되었습니다. –

+0

@ usr-bin-drinking : 다행스럽게도 도움이되었다 :) –