2009-09-02 10 views
7

Dzięki Spreadsheet::WriteExcel mogę utworzyć nowy skoroszyt, ale co zrobić, jeśli chcę otworzyć istniejącą książkę i zmodyfikować określone kolumny? Jak to osiągnąć?Jak zmodyfikować istniejący skoroszyt programu Excel za pomocą języka Perl?

Mogę parsować wszystkie dane z arkusza przy użyciu Spreadsheet::ParseExcel, a następnie zapisać je z nowymi wartościami w niektórych wierszach/kolumnach przy użyciu Spreadsheet::WriteExcel. Czy istnieje moduł, który już łączy te dwa?

Głównie chcę tylko otworzyć .xls, zastąpić niektóre wiersze/kolumny i zapisać.

Odpowiedz

13

Spreadsheet::ParseExcel będzie czytać w istniejących plikach Excel:

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

ale co ty naprawdę chce to Spreadsheet::ParseExcel::SaveParser, który jest połączeniem Spreadsheet::ParseExcel i Spreadsheet::WriteExcel. W dolnej części dokumentacji znajduje się example.

+0

Nie widzę sposobu, aby napisać do książki excel przy użyciu ParseExcel – user105033

+0

Arkusz kalkulacyjny :: ParseExcel :: SaveParser to zrobi. pobiłeś moją edycję. :) – Ether

3

Istnieje sekcja dokumentacji arkusza kalkulacyjnego :: WriteExcel, która obejmuje Modifying and Rewriting Spreadsheets.

Plik Excel to plik binarny w pliku binarnym. Zawiera kilka połączonych sum kontrolnych, a zmiana nawet jednego bajtu może spowodować jego uszkodzenie.

W związku z tym nie można po prostu dołączyć ani zaktualizować pliku Excel. Jedynym sposobem na osiągnięcie tego jest przeczytanie całego pliku w pamięci, wprowadzenie wymaganych zmian lub dodatków, a następnie ponowne zapisanie pliku.

Możesz odczytać i przepisać plik Excela za pomocą modułu Arkusz kalkulacyjny :: ParseExcel :: SaveParser, który jest opakowaniem wokół arkusza kalkulacyjnego :: ParseExcel i Arkusz kalkulacyjny :: WriteExcel. Jest częścią pakietu Spreadsheet::ParseExcel.

Istnieje również przykład.

1

Moduł Spreadsheet::ParseExcel::SaveParser jest opakowaniem wokół arkusza kalkulacyjnego :: ParseExcel i arkusza kalkulacyjnego :: WriteExcel.

Niedawno zaktualizowałem dokumentację, co mam nadzieję, is a clearer example of how to do this.

+0

Wciąż nie do końca rozumiem ten przykład. Nie mogę znaleźć dokumentacji dla tego, co SaveAs akceptuje. Czy możliwe jest przekazywanie uchwytów plików lub skalarycznego ref zamiast nazwy pliku? – Myforwik

+0

Ups Zrozumiałem, że John McNamara włączył pakiet write_to_scalar.pl do paczki.Za jego pomocą mogłem dokonać modyfikacji pamięci pliku XLS na pamięć: - D – Myforwik

9

Jeśli masz zainstalowany program Excel, to prawie banalne to zrobić z Win32::OLE. Oto przykład z Win32::OLE „s własnej dokumentacji:

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; 

Zasadniczo Win32::OLE daje wszystko, co jest dostępne w VBA lub aplikacji Visual Basic, który zawiera ogromną różnorodność rzeczy - wszystko z Excel i Word automatyki wymieniać i montować dyski sieciowe za pośrednictwem Hosta skryptów systemu Windows. Został standardowo wyposażony w kilka ostatnich edycji ActivePerl.

+1

Co więcej, możesz zapisywać całe tablice w kolumnach \ wierszy jednocześnie, co wpływa na szybkość pisania. Jeśli to nie wystarczy, możesz również napisać do programu Excel, który zawiera makro i uruchomić z tym modułem. –

+0

Dziękuję. Zauważyłem, że Arkusz kalkulacyjny :: ParseXLSX :: SaveParser nie istnieje, więc działa to znacznie lepiej. –

+0

@ usr-bin-drinking: Cieszę się, że to było pomocne :) –

Powiązane problemy